Есть ли у встроенных типов конструкторы по умолчанию?

Прочитав эту статью, я отметил, что 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++. (...)

Другие вопросы по тегам