Почему это не неприятный анализ? - PullRequest
3 голосов
/ 08 мая 2011

По сути, это продолжение этого вопроса о наиболее неприятном разборе.Я могу понять, что это связано с неоднозначностью между объявлением функции и определением переменной.

Но в Comeau онлайн я просто устал от следующего.не было ошибок.Я изучил стандартные документы, но не смог прийти к рассуждению.

Итак, что мне здесь не хватает?

Ответы [ 3 ]

7 голосов
/ 08 мая 2011

Потому что 10 не тип. :)

Это будет самый неприятный разбор:

T myT(T());
// T() gets interpreted as function pointer argument to a function returning T();
// This is equivalent to:
T myT(T (*fn)());

Вот еще одна разновидность «Наибольшего разбора»:

unsigned char c = 42;
T myT(int(c));
// int(c) gets interpreted as an int argument called c.
// This is equivalent to:
T myT(int c);
6 голосов
/ 08 мая 2011

10 не может быть именем типа параметра, поэтому это должно быть объявление переменной.

Компилятор должен выбрать объявление функции, когда он может это сделать, но во многих подобных случаях он не можетнет никакой двусмысленности.

3 голосов
/ 08 мая 2011

Это не досадный синтаксический анализ, потому что вы использовали целочисленный литерал, а не, скажем:

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.

Последняя интерпретация является интерпретацией по умолчанию, поэтому ошибка компилятора возникает в результате попытки использовать вновь объявленную функцию, как если бы это был объект, который вы ожидали.

См. Википедиюстатья об этом.

...