Есть ли у встроенных типов конструкторы по умолчанию?
Прочитав эту статью, я отметил, что int ()
дает 0, потому что временный int
значение инициализировано, а не потому что int()
вызывает конструктор по умолчанию для int
, (Статья ошибочна, насколько я понимаю.)
Я также сказал, что примитивные (встроенные) типы не имеют конструкторов. Оригинальный автор попросил меня проверить Раздел $10.4.2 (TC++PL), в котором говорится
Встроенные типы также имеют конструкторы по умолчанию ($6.2.8)
Но я все еще думаю, что утверждение "C++ позволяет даже встроенным типам (примитивным типам) иметь конструкторы по умолчанию". имеет недостатки (согласно C++03).
Я думаю, что Бьярне в TC++ PL перепутал конструктор, как нотации, т.е. ()
"с реальным вызовом конструктора. Инициализация значения не была введена в то время, когда Бьярн писал книгу, верно? Так что текст в TC++ PL неверен в соответствии с C++98 и C++03?
Что, вы парни, думаете?
РЕДАКТИРОВАТЬ
Я лично спросил Бьярне (по почте) о некорректном тексте в TC++ PL, и это был его ответ
Я думаю, что вы путаете "фактические вызовы конструктора" с концептуально имеющим конструктор. Считается, что встроенные типы имеют конструкторы (какие бы слова ни использовались стандартом для описания их поведения).
3 ответа
Конструктор является функцией-членом (конструкторы полностью определены в разделе 12 стандарта C++, который охватывает специальные функции-члены, такие как конструкторы и деструкторы).
Функция-член может быть определена только для типа класса (C++03 9.3/1 говорит, что "функции, объявленные в определении класса, за исключением функций, объявленных с помощью спецификатора друга, называются функциями-членами этого класса").
Таким образом, не относящиеся к классам типы (включая фундаментальные типы, типы массивов, ссылочные типы, типы указателей и типы enum) не имеют конструкторов.
У меня нет копии языка программирования C++, чтобы прочитать контекст цитаты о том, что "встроенные типы также имеют конструкторы по умолчанию", но я предполагаю, что Страуструп использует термин "конструктор" в свободном, не -технический смысл, или значение термина или способ его использования в Стандарте изменились между тем, когда книга была издана и когда язык был стандартизирован. Я предполагаю, что первое гораздо более вероятно, чем второе.
Простой ответ: технически нет.
Длинный ответ:
Нет.
Но синтаксис, который вы используете для их инициализации, делает их похожими на конструктор по умолчанию или конструктор копирования по умолчанию.
int x(5); // Looks like a constructor. Behaves like one: x is initialized.
int y(); // Fail. Actually a function declaration.
// BUT
int z = int(); // Looks like a constructor. Behaves like a constructor (0 init).
int a(b); // Again.
Так что технически нет конструкторов для базовых типов POD. Но для всех намерений и целей они действуют так же, как у них есть конструктор копирования и конструктор по умолчанию (при инициализации с фигурными скобками).
Если это похоже на утку и крякает как утка, то это очень похоже на утку.
Как уже отмечали другие, Стандарт противоречит TC++PL в нескольких случаях, часто связанных с терминологией. Сам Бьярне Страуструп хорошо суммирует ситуацию:
(...) Однако [TC++PL] не является справочным руководством или текстом стандартов. Если вам нужна точная и полная информация на 100%, вам следует ознакомиться с текстом стандарта ISO C++. (...)