механизм вызова конструктора - PullRequest
9 голосов
/ 26 ноября 2010
struct my
{
   my(){ std::cout<<"Default";}
   my(const my& m){ std::cout<<"Copy";}
   ~my(){ std::cout<<"Destructor";}
};

int main()
{
   my m(); //1
   my n(my()); //2
}

Ожидаемый вывод:

1 ) Default
2 ) Copy

Фактический вывод:


Что не так с моим пониманием механизма вызова конструктора?

Note Для краткости я опустил заголовочные файлы.

Ответы [ 2 ]

11 голосов
/ 26 ноября 2010

Дело 1)

m интерпретируется как функция, возвращающая my и не принимающая аргументов. Чтобы увидеть ожидаемый результат, удалите (), т.е. используйте my m;

Дело 2)

Это что-то более известное как "Самый неприятный анализ".

n интерпретируется как функция, возвращающая my, которая принимает аргумент типа указатель на функцию, возвращающую my без каких-либо аргументов.

Чтобы увидеть ожидаемый результат в этом случае, попробуйте my n((my())); [Вместо того, чтобы рассматривать как спецификацию аргумента, как в первом случае, компилятор теперь интерпретирует его как выражение из-за дополнительных ()]

Моя интерпретация:

my n((my())) эквивалентно my n = my(). Теперь выражение rvalue my() создает временный [т.е. вызов конструктора по умолчанию], и n инициализируется копией этого временного объекта [нет вызова copy-ctor из-за некоторой оптимизации компилятора ]

P.S : Я не уверен на 100% в последней части моего ответа. Поправь меня, если я ошибаюсь.

1 голос
/ 26 ноября 2010

Как и Prasoon, я подозреваю, что компилятор C ++ анализирует ваш код так, как вы этого не ожидаете. Например, я думаю, что это анализ строки

my m();

как объявление прототипа функции, а не как объявление переменной и вызов конструктора - поэтому вы не видите вывода.

...