2013-07-17 4 views
7

Этот код был опубликован в http://accu.org/index.php/cvujournal, выпуск июля 2013. я не мог понять вывод, любое объяснение будет helphfulКаков результат следующего кода?

#include <iostream> 
int x; 

struct i 
{ 
    i() { 
     x = 0; 
     std::cout << "--C1\n"; 
    } 

    i(int i) { 
     x = i; 
     std::cout << "--C2\n"; 
    } 
}; 

class l 
{ 
public: 
    l(int i) : x(i) {} 

    void load() { 
     i(x); 
    } 

private: 
    int x; 
}; 

int main() 
{ 
    l l(42); 
    l.load(); 
    std::cout << x << std::endl; 
} 

Выход:

--C1 
0 

я ожидал:

--C2 
42 

Любое пояснение?

+2

'void load() {i y (x); } 'выводит то, что вы ожидали. – Derek

+0

Или, проще говоря, 'i {x};' – chris

+0

@chris Это работает только для C++ 11, правильно? – Derek

ответ

20

i(x); эквивалентно i x; с резервной парой скобок придачи Он объявляет переменную x типа i, по умолчанию инициализируется. он не создает временный экземпляр i с параметром x в качестве параметра конструктора. См. Также: most vexing parse

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