Неопределенность синтаксиса C ++ - PullRequest
6 голосов
/ 07 апреля 2011

Рассмотрим:

void f(std::pair<bool,bool> terms = std::pair<bool,bool>(1,1)) {}

gcc 4.4 в порядке, gcc 4.3 жалуется error: expected ',' or '...' before '>' token. Исправление:

void f(std::pair<bool,bool> terms = (std::pair<bool,bool>(1,1))) {}

В чем причина? Это ошибка в 4.3?

1 Ответ

8 голосов
/ 07 апреля 2011

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

См. http://www.open -std.org / jtc1 / sc22 / wg21 / docs / cwg_active.html # 325 , чтобы почитать об этом.Цитируется

Другая проблема связана со сбором токенов, которые образуют выражение аргумента по умолчанию.Аргументы по умолчанию, которые содержат идентификаторы шаблона с более чем одним параметром, затрудняют определение завершения аргумента по умолчанию.Учтите,

template <int A, typename B> struct T { static int i;};
class C {
  int Foo (int i = T<1, int>::i);
};

Аргумент по умолчанию содержит запятую без скобок.Требуется ли, чтобы эта запятая рассматривалась как часть выражения аргумента по умолчанию, а не как начало другого объявления аргумента?Чтобы принять это как часть аргумента по умолчанию, потребуется поиск имени в T (чтобы определить, что '<является частью списка аргументов шаблона, а не оператором меньше) перед завершением C.Кроме того, более патологическое </p>

class D {
  int Foo (int i = T<1, int>::i);
  template <int A, typename B> struct T {static int i;};
};

будет очень трудно принять.Даже если T объявлен после Foo, T находится в области видимости в выражении аргумента Foo по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...