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

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 Я сократил заголовочные файлы для краткости.

Дело 1)

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

Случай 2)

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

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

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

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

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

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

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

 my m(); 

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

  • Конструктор UserControl с параметрами в C #
  • Защищенный конструктор и доступность
  • Как эта `this` ссылка на внешний class исчезает из-за публикации экземпляра внутреннего classа?
  • Почему конструктор копирования принимает свой параметр по ссылке в C ++?
  • В любом случае, @Autowire bean, который требует аргументов конструктора?
  • Почему конструктор копирования не вызывается в этом случае?
  • Что на самом деле делает «новое» ключевое слово на Java, и не следует ли мне создавать новые объекты?
  • Конструктор шаблонов C ++
  • Почему у C ++ нет конструктора const?
  • Delphi: Как скрыть конструкторы предков?
  • Может ли абстрактный class иметь конструктор?
  • Interesting Posts

    mySQL DataSource на Visual Studio 2012

    Как преобразование float / double в int обрабатывается в printf?

    значение «ссылки» и «разыменование»,

    Отправка HTTP-запросов с помощью VBA из Word

    Пользовательский десериализатор JSON с использованием Gson

    Исключает ли Null Pointer исключение кода?

    Как измерить внутреннее время ядра в NVIDIA CUDA?

    Выберите весь текст внутри EditText, когда он получит фокус

    Каков наилучший способ обхода проблемы WCF с использованием “ `WCF?

    Серьезность ошибки «умного» диска. Как долго это будет продолжаться?

    Есть ли эффективный способ копирования текста из PDF без разрывов строк?

    Maven 3.3.1 ECLIPSE: -Dmaven.multiModuleProjectDirectory система не задана

    Самый безопасный способ удаления Ubuntu с компьютера с двойной загрузкой

    Сценарий Linux iptables для блокировки всего доступа в Интернет, за исключением желаемых приложений

    Какая разница в том, использует ли компьютер USB-адаптер Ethernet или сетевую карту?

    Давайте будем гением компьютера.