Механизм вызова конструктора

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();

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

Другие вопросы по тегам