2012-06-20 2 views
19

Возможный дубликат:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?конструктор по умолчанию для Int

В ответ на this question говорят, что

Интс являются по умолчанию, возведенных как 0, так как если вы инициализировали их с помощью int(). Другие примитивные типы инициализируются аналогично (например, double(), long(), bool() и т. Д.).

Как раз в то время, когда я объяснял это коллеге, я составил следующий код: compiled (gcc-4.3.4) and ran и наблюдал за неожиданным поведением.

#include <iostream> 

int main() { 
    int i(); 
    std::cout << i << std::endl; // output is 1 
} 

Почему выход 1 но 0?

+1

Это объясняется в: [Почему это ошибка использовать пустой набор скобок вызвать конструктор без аргументов?] (HTTP: //stackoverflow.com/questions/180172/why-is-it-an-error-to-use-an-empty-set-of-brackets-to-call-a-constructor-with-no) –

+1

Я удивил, что он даже компилируется, так как кажется, что вы наткнулись на [наиболее неприятный синтаксический разбор] (http://en.wikipedia.org/wiki/Most_vexing_parse). –

+1

Поздравляем вас с обнаружением [наиболее неприятного разбора] (http://en.wikipedia.org/wiki/Most_vexing_parse). – dasblinkenlight

ответ

27

Вступает в игру с большим досадным разоблачением. Вы фактически объявляете функцию i, а не переменную int. Он не должен даже компилироваться (если у вас нет функции i, определенной где-то ... вы?).

Чтобы значение инициализировать Int, вам необходимо:

int i = int(); 
+1

Я думаю, что неявный бросок на 'bool'. – aschepler

+0

Это должно быть ошибка в предыдущих версиях GCC; в 4.7 он не компилируется. – Griwes

+0

@ Griwes, может быть, он где-то определяет функцию и не знает об этом. –

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