Дело 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% в последней части моего ответа. Поправь меня, если я ошибаюсь.