Страницы

Поиск по вопросам

среда, 10 октября 2018 г.

Объявление функции, похожее на создание объекта

class Test { };
int main(int argc, char* argv[]) { Test t(); // Что делает этот оператор
return 0; }


Ответ

Это частный пример явления, известного в С++ под именем "most vexing parse". В ситуациях, когда в объявлении возникает неоднозначность между определением объекта и объявлением функции, эта неоднозначность в С++ разрешается в пользу объявления функции.
В вашем случае имеет место простейший пример именно такой неоднозначности. В соответствии с вышеприведенным правилом, данное объявление трактуется как объявление функции t, не имеющей параметров и возвращающей значение типа Test
Для определения именно объекта c выполнением value-инициализации можно воспользоваться современным (С++11 и далее) синтаксисом униформной инициализации, который не страдает от этой неоднозначности
Test t{};
Хотя в случае именно вашего (т.е. "пустого") класса Test явный инициализатор не имеет никакого значения вообще и можно просто написать
Test t;

Комментариев нет:

Отправить комментарий