Имеют ли примитивные типы также конструкторы в С++?

Я прочитал в книге доктора Бьярна Страуструпа «Язык программирования С++», 3-е издание, в разделе 10.4.2 встроенные типы также имеют конструкторы в С++.

Но затем следующая ссылка говорит, что типы POD не могут иметь конструкторов:

http://www.parashift.com/c++-faq-lite/pod-types.html

Что является правдой? Имеют ли примитивные типы также конструкторы в С++?


person Destructor    schedule 21.07.2014    source источник
comment
Процитируйте соответствующий текст из книги.   -  person chris    schedule 21.07.2014
comment
Ведь без этого мы не можем прояснить ситуацию. Хотя, читая этот связанный текст, POD != примитивный.   -  person aruisdante    schedule 21.07.2014
comment
Вы можете притвориться, что у них есть конструкторы для большей части синтаксиса.   -  person Neil Kirk    schedule 21.07.2014
comment
Вы можете с уверенностью предположить, что г-н Страуструп более надежен в отношении C++, чем случайный веб-сайт.   -  person Isaac    schedule 21.07.2014
comment
Кстати, тип класса POD должен иметь тривиальный конструктор по умолчанию в соответствии с §9 [класс]/6 и /10.   -  person chris    schedule 21.07.2014
comment
@Isaac, этот FAQ является признанным ресурсом C++. На самом деле, он и собственный FAQ Бьерна были в основном объединены, чтобы сделать официальным FAQ по C++ (или наиболее близким к нему). официальный у нас может быть). В любом случае, в FAQ действительно должно быть сказано об отсутствии конструкторов, определяемых пользователем, но когда он был написан, не было возможности определить тривиальный конструктор, поэтому я думаю, в нем должно быть сказано, что ему нужны неявные конструкторы, сгенерированные компилятором.   -  person chris    schedule 21.07.2014
comment
@Крис: Интересно. Так что это не просто случайный веб-сайт. Я предполагаю, что пользовательские конструкторы - это то, что на самом деле имел в виду этот FAQ. Примитивные типы уже имеют конструктор.   -  person Isaac    schedule 21.07.2014
comment
@aruisdante: Хорошо. Ссылка касается типов POD, и в ней говорится, что у них не может быть конструктора, поэтому их можно использовать и в C. ОП спрашивает, есть ли у примитивных типов конструктор или нет. Суть в том, что у примитивных типов в C++ есть конструктор, а у POD нет.   -  person Isaac    schedule 21.07.2014
comment
Аналогичный вопрос: stackoverflow.com/ вопросы/5113365/   -  person chris    schedule 21.07.2014
comment
@Isaac Исаак, они у них есть, просто они должны автоматически генерироваться компилятором.   -  person aruisdante    schedule 21.07.2014
comment
@Isaac, типы POD (включая встроенные типы) не обязаны иметь один, но типы класса POD обязательны, но не определяются пользователем.   -  person chris    schedule 21.07.2014


Ответы (1)


Бьерн имеет в виду, что вы можете написать int(56) или даже int() для построения целого числа. Ссылки означают, что struct/class является POD только в том случае, если в нем не объявлен конструктор. Таким образом, Бьерн говорит о примитивных типах, не являющихся структурами, а ссылка говорит о структурах/классах, поэтому два источника могут сосуществовать, не противореча друг другу.

Вот часть определения по ссылке:

нестатические элементы данных типа POD должны быть общедоступными и могут относиться к любому из этих типов

Конечно, это справедливо только для структур. int не имеет "элементов данных". Поэтому, хотя ссылка никогда не упоминает об этом напрямую, она относится только к структурам и классам.

person gexicide    schedule 21.07.2014
comment
POD также не должен иметь методов (не только объявленного конструктора/деструктора). По сути, вы можете делать то, что разрешено со структурой C, только если вы хотите, чтобы структура была переносима между C++ и C без изменений. - person aruisdante; 21.07.2014
comment
@aruisdante, неправда. Запрещены только виртуальные функции. FWIW, я говорю о С++ 11, но текст С++ 03: POD-struct — это совокупный класс, который не имеет нестатических элементов данных типа non-POD-struct, non-POD -union (или массив таких типов) или ссылка и не имеет определяемого пользователем оператора присваивания копии и определяемого пользователем деструктора, где агрегат — это массив или класс (пункт 9) без конструкторы, объявленные пользователем (12.1), никаких частных или защищенных нестатических элементов данных (пункт 11), никаких базовых классов (пункт 10) и никаких виртуальных функций (10.3). - person chris; 21.07.2014
comment
@chris Вы правы, я прочитал это как создание структуры, которая будет компилироваться с обоими, но это просто структура, которая действует как C-структура для инициализации / копирования, а не компилируемая как таковая. - person aruisdante; 21.07.2014