интервал = интервал (); что происходит в С++98?

Пожалуйста, прочитайте вопрос полностью, прежде чем пометить его как дубликат. Заявление вроде

int i=int();

большинство программистов скажут, что здесь есть инициализация значения, и i будет инициализировано значением. (0 на выходе). Но он также выводит 0 в качестве вывода компилятора С++ 98. Следующая программа, которую я тестировал на реализации С++ 98, дает мне 0 в качестве вывода.

#include <iostream>
int main()
{
     int i=int();
     std::cout<<i;
}

Не говорите, что значение i инициализировано в приведенной выше программе C++98, потому что инициализация значения введена в C++03. Итак, как я инициализировался здесь? Это действительно вызов конструктора? int() выглядит как вызов конструктора. Примитивные типы также имеют конструкторы по умолчанию в C++, как сказал Бьярн Страуструп в своей книге «Язык программирования C++ и TC++PL».

Язык программирования C++ Бьярн Страуструп:

10.4.2 Встроенные типы также имеют конструкторы по умолчанию

также прочитайте раздел 6.2.8 той же книги.

В следующих ссылках также говорится, что встроенные типы имеют конструкторы по умолчанию в C++.

1) http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=15

2) http://www.geeksforgeeks.org/c-default-constructor-built-in-types/

Так могу ли я действительно сказать, что это вызов конструктора целочисленного типа?


person Destructor    schedule 02.06.2015    source источник
comment
@vsoftco: Как это возможно?   -  person Destructor    schedule 02.06.2015
comment
Ни один (сравнительно недавний) компилятор, о котором я знаю, не имеет фактического режима С++ 98.   -  person T.C.    schedule 02.06.2015
comment
Я не буду копаться в истории за вас, но если концепция инициализации значения была введена как отчет о дефекте, исправляющий поведение C++98, то компиляторы задним числом реализуют это даже для режима C++98. В любом случае, почему различия между C++98 и C++03 вообще имеют значение? Просто примите последнее как то, чем был C++ после стандартизации до C++11.   -  person Praetorian    schedule 02.06.2015
comment
Большинство компиляторов не делают различий между C++03 и C++98. Первое было фактически исправлением ошибки для второго, поэтому компиляторы, как правило, объединяют их вместе и дают вам C++03, если вы запрашиваете C++98.   -  person jalf    schedule 02.06.2015
comment
@vsoftco Вы имеете в виду вывод типа возвращаемого значения? Это считается DR против C++11.   -  person T.C.    schedule 02.06.2015
comment
@Т.С. да, я действительно задал вопрос до stackoverflow.com/questions/28955478/   -  person vsoftco    schedule 02.06.2015
comment
Связанный: stackoverflow.com/questions/27356712/   -  person T.C.    schedule 02.06.2015
comment
@Т.С. Вау, совсем не помню   -  person Lightness Races in Orbit    schedule 02.06.2015


Ответы (1)


5.2.3 Явное преобразование типов (функциональная нотация)

2 Выражение T(), где T — спецификатор простого типа (7.1.5.2) для полного типа объекта, не являющегося массивом, или типа void (возможно, cv-квалифицированный), создает значение rvalue указанного типа, значение которого определяется по умолчанию-инициализация (8.5; для случая void() инициализация не выполняется). [...]

8.5 Инициализаторы

5 [...] Инициализация по умолчанию объекта типа T означает:

-- если T не является типом класса POD (раздел 9), вызывается конструктор по умолчанию для T (и инициализация является неправильной, если T не имеет доступного конструктора по умолчанию);

-- если T является типом массива, каждый элемент инициализируется по умолчанию;

-- в противном случае хранилище для объекта инициализируется нулями.

Нет проблем. int() было гарантированно равно нулю с самого первого стандарта C++. Тот факт, что это произошло с помощью инициализации по умолчанию, а не инициализации значения, является технической деталью, которая совершенно не имеет отношения к вашему вопросу.

person Community    schedule 02.06.2015
comment
Итак, задача конструктора по умолчанию — выполнять инициализацию по умолчанию для встроенных типов? - person Destructor; 03.06.2015
comment
@meet Когда говорится о типе класса, отличном от POD, это означает тип класса, который не является типом класса POD, а не тип, который не является типом класса POD. Применяется третий пункт: хранилище для объекта инициализируется нулями. Никакой конструктор не используется. - person ; 03.06.2015
comment
так точно, когда вызывается и используется конструктор встроенного типа? - person Destructor; 03.06.2015
comment
@meet Встроенные типы не имеют конструкторов. Конструкторы являются функциями-членами, а встроенные типы не имеют и не могут иметь никаких членов. Так что никогда. Тем не менее, некоторые люди предпочитают говорить, что int имеет конструктор по умолчанию, а int() вызывает этот конструктор по умолчанию. Это не то, как это описывает стандарт C++, как вы можете видеть из моей цитаты, и, насколько мне известно, это необычная точка зрения, но конечный результат тот же, так что это не неправильно, просто, возможно, сбивает с толку. - person ; 03.06.2015
comment
Но Бьерн Страуструп в своей книге «Язык программирования C++» в разделе 10.4.2 говорит, что встроенные типы также имеют конструкторы по умолчанию. - person Destructor; 03.06.2015
comment
@meet Да, он действительно так говорит, и это необычная точка зрения, которую я имел в виду. Стандарт С++ описывает это по-другому, как я сказал здесь в своем ответе. (stackoverflow.com/questions/ 5113365/ — уместный вопрос об этом.) - person ; 03.06.2015
comment
Давайте продолжим обсуждение в чате. - person Destructor; 03.06.2015