Последнее предложение §6.3.5.1 от Страуструпа C++ Язык программирования (4-е издание здесь) является:Ошибка в языке программирования Stroustrup на языке C++?
Член массива или класс по умолчанию инициализируется, если массив или структура.
Однако this test показывает неинициализированные члены объекта по умолчанию инициализируется (я также попытался с g++4.7 -std=c++11
)
#include <iostream>
struct Foo
{
int i;
Foo();
};
Foo::Foo() {}
int main()
{
Foo f;
std::cout << "f.i: " << f.i << std::endl;
return 0;
}
Я должен что-то отсутствует, но есть объяснение, которое не означает ошибка в утверждении Страустрапа?
EDIT: После ответов я понимаю, что понятие по умолчанию инициализируется должен включать то, что называется неинициализированный в других частях текста (например, в §17.3.1). Это звучит очень неясно для меня. Фактически, использование неинициализировано означает что-либо иное, чем «явно не инициализированное пользователем» (как это имеет место в данном случае) является противоречием: некоторые вещи инициализируются по умолчанию и все же неинициализированы. Если один не упадет доказательств естественного языка, что X и не-X классифицируют напротив, эксклюзивные наборы вещей ...
Кроме того, более ранний срок в том же разделе (§6.3.5.1) читает
Местный переменные [...] не инициализируются по умолчанию, если только они не являются определенными пользователем типами со стандартным конструктором [...]
Это противоречие здесь очевидно. Принятие как первого, так и последнего операторов должно быть истинным подразумевает, что существуют переменные (а именно локальные переменные), которые одновременно являются по умолчанию инициализированы и не инициализированы по умолчанию.
ИМХО это, в лучшем случае, очень нечеткое использование естественного языка для описания чего-то.
Я думаю об этом как: «инициализация по умолчанию» может быть «инициализирована неопределенным значением».Он _is_ инициализирован и безопасен для записи, но не определен для чтения. Но да, формулировка сбивает с толку и противоречит самому себе. –