Механизм вызова конструктора
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 ответа
Случай 1)
m
интерпретируется как возврат функции my
и не принимая никаких аргументов. Чтобы увидеть ожидаемый результат, удалите ()
т.е. использовать my m;
Дело 2)
Это что-то более известное как "Самый неприятный анализ".
n
интерпретируется как функция, возвращающая my
который принимает аргумент типа указатель на функцию, возвращающую my
не принимая никаких аргументов.
Чтобы увидеть ожидаемый результат в этом случае попробуйте my n((my()));
[Вместо того, чтобы рассматривать как спецификацию аргумента, как в первом случае, компилятор теперь интерпретирует его как выражение из-за дополнительной ()
]
Моя интерпретация:
my n((my()))
эквивалентно my n = my()
, Теперь выражение Rvalue my()
создает временный [то есть вызов конструктора по умолчанию] и n
инициализируется ли копия для этого временного объекта [нет вызова copy-ctor из-за некоторой оптимизации компилятора]
PS: я не уверен на 100% в последней части моего ответа. Поправь меня, если я ошибаюсь.
Как и Prasoon, я подозреваю, что компилятор C++ анализирует ваш код так, как вы этого не ожидаете. Например, я думаю, что это анализ строки
my m();
как объявление прототипа функции, а не как объявление переменной и вызов конструктора - поэтому вы не видите выходных данных.