Стандартные требования C++ к шаблонам, которые не были созданы

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

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 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам