Стандартные требования C ++ к шаблонам, которые не были созданы - PullRequest
0 голосов
/ 26 ноября 2018

Итак, я попытался скомпилировать приведенный ниже код, и он не сработал (как и ожидалось):

1.cpp: In function ‘int foo()’:
1.cpp:3:5: error: ‘some’ was not declared in this scope
     some ill-formed code
     ^

Но если я уберу эту строку, компилятор скомпилирует ее без каких-либо ошибок (также ожидается, что неизвестно,Тип T имеет метод random_name() или нет).

Кажется, что диагностика для шаблонов, которые не используются (не создаются), является реализацией, определенной в некоторой степени.Но, возможно, у стандарта есть некоторые требования для таких случаев.Например, будет ли соответствовать стандарту компилировать приведенный ниже код без каких-либо ошибок?

Я пытался найти ответ на сайте, но не смог найти связанных вопросов.

template <class T>
int foo() {
    some ill-formed code
    return T::random_name();
}

template <>
int foo<int>() { return 0; }

int main() {
    return foo<int>();
}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Имена внутри функции template либо зависят , т. Е. Сущность зависит от template параметров в некоторой форме, либо они независимы , т. Е. Существуетнет признаков того, что это зависит от параметра template.Независимые имена ищутся, когда определена функция template.Зависимые имена ищутся во время template создания экземпляра, т. Е. Имя не нужно определять, когда определена функция template.Ошибка при поиске имени является ошибкой.Детали этого процесса немного сложнее и заполняют большую часть главы по template s.

В вашем случае some является независимым именем, тогда как квалификация T:: делает random_name зависимымимя.

0 голосов
/ 26 ноября 2018

Это проблема качества реализации, она плохо сформирована, но если она не создана, диагностика не требуется согласно [temp.res # 8.1] p :

Срок действия шаблона может быть проверен до любого экземпляра.[Примечание: Зная, какие имена являются именами типов, можно таким образом проверять синтаксис каждого шаблона.- примечание к концу] Программа является некорректной, диагностика не требуется, если :

  • для шаблона или подстановки оператора constexpr if нельзя создать допустимую специализациюшаблон и шаблон не созданы, или

, и мы можем видеть из этого примера с живым крестом MSVC не диагностирует этот случай.Это потому, что MSVC не использует двухфазный поиск , но использование /permissive- меняет это.У clang даже есть режим совместимости MSVC для эмуляции этого с использованием -fdelayed-template-parsing.

Мы можем видеть из этого живого крестника, используя эти две опции clang больше не производит диагностикуно MSVC делает.

...