2016-12-06 2 views
1

ХотяКонструктор по умолчанию любопытство

MyClass m(); 

является классическим Гочей, так как он не объявить переменные м, но функция принимает нулевые аргументы и возвращает MyClass. Тем не менее, я обнаружил, что в Visual Studio следующее заявление создает такую ​​же проблему (это, кажется, это как-то colapses к вышеуказанному заявлению):

MyClass m(MyClass()); 

Может кто-нибудь объяснить это поведение?

Примечание: более «явная» версия того, что ожидается, делает правильную вещь (т. Е. Вызывает значение по умолчанию, затем конструктор перемещения).

MyClass m(std::move(MyClass())); 

ответ

4

Это раздосадовать Анализировать проблема.

MyClass m(MyClass()); 

Эта строка обрабатывается как функция с именем м возвращающей объект типа MyClass и принимающей один аргументом, который является указателем на функцию без аргументов и возвращаемого значения типа MyClass.

Здесь:

MyClass m(std::move(MyClass())); 

станд :: ход помогает компилятор для разбора строки, как и ожидалось.

3

Да, это классический самый Vexing Parse. Все, что выглядит как функция, является функцией, даже если это может быть что-то другое.

Есть несколько устаревших методов, чтобы перевести это в правильное определение переменного, но лучше один заключается в использовании единообразной инициализации:

MyClass m{MyClass()}; 

(Несмотря на то, что приведенном выше пример является излишним, и лучшим примером когда типы различны, например A m{B()};)

Смежные вопросы