Почему имя_папки _не_ здесь необходимо в Visual Studio 2008/2010? - PullRequest
6 голосов
/ 16 апреля 2011

В этом вопросе задающий имеет следующую функцию:

template<typename ITER>
bool nextPermutation(ITER start, ITER end)
{
    return nextPermutation(start, end, std::iterator_traits<ITER>::iterator_category());
}

Почему typename не требуется перед std::iterator_traits?Я думал, что это было необходимо для вложенных типов шаблона, если шаблон зависит от самого параметра шаблона?GCC, похоже, поддерживает мою идею, поскольку он не компилируется под 4.3.4 и 4.5.1 , требуя typename.Несмотря на это, он все равно прекрасно компилируется как в Visual Studio 2008, так и в 2010 году.
Это просто еще одно расширение / ошибка Visual Studio, о которой я не знаю?
Или действительно можно сделать вывод, что iterator_categoryили тип, или функция, потому что за ней следует пара круглых скобок ()?(См. Сообщения @ DeadGM , начинающиеся здесь .) Так, может, это на самом деле ошибка в GCC?

Ответы [ 2 ]

12 голосов
/ 16 апреля 2011

Хорошо известно, что Visual C ++ не поддерживает (полностью) двухфазный поиск, что является основной причиной, по которой typename требуется в первую очередь. Если компилятор не полностью поддерживает это, он может не полностью проанализировать шаблон до его создания, и к этому времени он «узнает», что std::iterator_traits<ITER>::iterator_category является типом. Очевидно, этот недостаток распространяется на VC10.

Когда дело доходит до typename, я доверяю GCC через VC в любой день.

6 голосов
/ 16 апреля 2011

Разве MSVC не реализует схему позднего анализа? В такой схеме компилятор не зависит от typename. Он просто хранит весь токен между фигурными скобками определения шаблона, и когда шаблон создается, он анализирует эти токены. Так как он знает, что есть, а что нет, он будет работать без typename.

Но если компилятор не диагностирует отсутствующее typename при создании экземпляра шаблона, он не соответствует.

Или действительно возможно сделать вывод, что iterator_category является либо типом, либо функцией, потому что за ней следует пара скобок ()?

Все, что имеет значение, это то, является ли имя зависимым и квалифицированным. Может ли шаблон сделать вывод, что имя всегда является типом, не имеет значения. Это может иметь значение для качества сообщений об ошибках при отсутствии typename s.

FWIW, нет, невозможно ничего сделать о iterator_category на уровне языка.

...