Подтвердить что ты не робот

У встроенных типов есть стандартные конструкторы?

После прочтения этой статьи я сделал вывод, что int () дает 0, потому что временная int инициализируется значением, а не потому, что int() вызывает конструктор по умолчанию для int. (Статья ошибочна в соответствии с моим пониманием.)

Я также сказал, что примитивные (встроенные) типы не имеют конструкторов. Оригинальный автор попросил меня проверить раздел $10.4.2 (TС++ PL), в котором говорится

Встроенные типы также имеют конструкторы по умолчанию ($ 6.2.8)

Но я все же думаю, что утверждение "С++ позволяет даже встроенный тип (примитивные типы) иметь конструкторы по умолчанию". (согласно С++ 03).

Я думаю, что Bjarne в TС++ PL перепутал "конструктор вроде нотации i.e ()" с фактическим вызовом конструктора. Инициализация значения не была введена в то время, когда Бьярн писал книгу, верно? Так ли текст в TС++ PL некорректен в соответствии с С++ 98 и С++ 03?

Что вы, ребята, думаете?

ИЗМЕНИТЬ

Я лично спросил Бьярне (по почте) о некорректном тексте в TС++ PL, и это был его ответ

Я думаю, что вы смешиваете "фактические вызовы конструктора" с концептуальным конструктором. У встроенных типов есть конструкторы (любые слова, используемые стандартом для описания их поведения).

4b9b3361

Ответ 1

Конструктор - это функция-член (конструкторы полностью указаны в разделе 12 Стандарта С++, который охватывает специальные функции-члены, такие как конструкторы и деструкторы).

Функция-член может быть определена только для типа класса (С++ 03 9.3/1 говорит: "Функции, объявленные в определении класса, исключая объявленные с помощью спецификатора друга, называются функциями-членами этого класса" ).

Таким образом, типы неклассов (включая фундаментальные типы, типы массивов, ссылочные типы, типы указателей и типы перечислений) не имеют конструкторов.

У меня нет копии языка программирования С++ для чтения контекста цитаты, в которой "встроенные типы также имеют конструкторы по умолчанию", но я бы предположил, что Stroustrup использует термин "конструктор" в свободный, нетехнический смысл или значение термина или способ, которым он используется в Стандарте, изменились между публикацией книги и стандартизацией языка. Я бы предположил, что первое гораздо более вероятно, чем последнее.

Ответ 2

Простой ответ: Технически Нет.

Длительный ответ:

Нет.
Но синтаксис, используемый для их инициализации, заставляет их выглядеть так, как будто они создаются конструктором по умолчанию или конструктором копии по умолчанию.

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. Но для всех целей и задач они действуют так же, как у них есть конструктор копирования и конструктор по умолчанию (при инициализации с помощью фигурных скобок).

Если это выглядит как утка и шарлатанцы, как утка, то ее самая утка нравится.

Ответ 3

Как уже отмечали другие, Стандарт противоречит T C++ PL в нескольких случаях, часто связанных с терминологией. Сам Бьярне Страуструп хорошо суммирует ситуацию:

(...) Однако [T C++ PL] не является справочным руководством или текстом стандартов. Если вам нужна точная и полная информация на 100%, вам следует обратиться к тексту стандарта ISO C++. (...)