Это не досадный синтаксический анализ, потому что вы использовали целочисленный литерал, а не, скажем:
T myT(T());
Как в этом полном примере:
#include <iostream>
struct T { int f() { return 1; } };
int main(int argc, char** argv) {
T t(T());
std::cout << t.f() << '\n';
return 0;
}
Что неоднозначно, потому что это может означать:
myT
- это T
, инициализированный с помощью построенного по умолчанию T
;или myT
- это функция, возвращающая T
и принимающая один аргумент типа T()
, который обозначает функцию с нулевым аргументом, тип возврата также T
.
Последняя интерпретация является интерпретацией по умолчанию, поэтому ошибка компилятора возникает в результате попытки использовать вновь объявленную функцию, как если бы это был объект, который вы ожидали.
См. Википедиюстатья об этом.