2013-07-04 3 views
3

Последнее предложение §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) читает

Местный переменные [...] не инициализируются по умолчанию, если только они не являются определенными пользователем типами со стандартным конструктором [...]

Это противоречие здесь очевидно. Принятие как первого, так и последнего операторов должно быть истинным подразумевает, что существуют переменные (а именно локальные переменные), которые одновременно являются по умолчанию инициализированы и не инициализированы по умолчанию.

ИМХО это, в лучшем случае, очень нечеткое использование естественного языка для описания чего-то.

+1

Я думаю об этом как: «инициализация по умолчанию» может быть «инициализирована неопределенным значением».Он _is_ инициализирован и безопасен для записи, но не определен для чтения. Но да, формулировка сбивает с толку и противоречит самому себе. –

ответ

6

согласно § 8.5/7:

Для того, чтобы по умолчанию инициализировать объект типа Т означает:
- если Т (возможно, CV-Quali фи-е изд) тип класса (пункт 9), конструктор по умолчанию для T называется (и инициализация плохо сформирована, если T не имеет доступного конструктора по умолчанию);
- если T - тип массива, каждый элемент инициализируется по умолчанию;
- в противном случае инициализация не выполняется.

int попадает в последнюю точку, поэтому он остается неинициализированным. Если у вашего участника был тип, скажем, std::string, он вызывал бы конструктор по умолчанию std::string, и у вас была бы пустая строка.

+0

Я думаю, что в лучшем случае неясно. Из предыдущего текста вы бы поняли, что инициализированный int по умолчанию имеет значение 0 (например, это относится к глобальной переменной int). На самом деле, предыдущая страница гласит: «Локальные переменные [...] не инициализируются по умолчанию, если только они не являются определяемыми пользователем типами со стандартным конструктором». Таким образом, это будет переменная, которая инициализируется по умолчанию (по определению, которое вы отправили), но не было бы инициализировано по умолчанию ... не кажется мне очень когерентным – ricab

+3

@ricab, стандарт определяет инициализацию по умолчанию, значение -инициализация и нуль-инициализация. Неинициализация не является одной из этих категорий. Для вашего комментария глобальной переменной эти значения инициализируются нулем (§ 3.6.2/2), что для 'int' (и в основном всего) означает 0. Значение инициализации' int' также даст вам 0. Однако, инициализация этого не сделала бы, это оставило бы его неинициализированным. Это дело по умолчанию, когда вы объявляете обычный локальный 'int' без какого-либо инициализатора. 'int' не является определяемым пользователем типом, поэтому по умолчанию он не инициализируется. – chris

+1

@ricab, факт, что инициализация по умолчанию может оставить вещи неинициализированными, может показаться странной, но она делает классификацию всего проще. – chris

Смежные вопросы