Локальный тип в качестве аргумента шаблона внутри неинстанцированной функции

Локальный тип в качестве аргумента шаблона запрещен в C ++ 03:

template<typename T>
struct Foo { };

void Make()
{
struct Unknown {};
Foo<Unknown> foo; // Bad
}

Есть ли в Стандарте директивы о проверке этого правила в случае шаблона не создан?
Можно ли быть уверенным, что это правило проверяется только после попытки создания шаблона (без создания экземпляра => успех компиляции)?

template<typename T>
struct Foo { };

template<typename T>
void Do(T&) { }

template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
struct Unknown {};
Foo<Unknown>::UnknownMethod();
}

int main()
{
std::string s;
Do(s);
}

1

Решение

В C ++ 03 такой директивы нет, потому что

  1. В C ++ 03 нет директив и
  2. правило делает не скажи это инстанцировании шаблон с локальным типом в качестве параметра в ошибке, он говорит с помощью локальный тип в качестве параметра шаблона является ошибкой.

Он не должен быть успешным, если шаблон не создан.

С другой стороны, некоторые компиляторы разрешают локальные типы в качестве параметров шаблона (например, Visual C ++; нет, он не соответствует стандарту, но это срок службы), поэтому вы все равно не сможете использовать его для принудительного сбоя компиляции.

Если вам нужно потерпеть неудачу при компиляции, когда попытается какая-то комбинация, используйте стандартное статическое утверждение. Вы можете использовать Boost.Static Assert реализация, реализация связана с πάντα ῥεῖ в комментариях или простая реализация в этом другом вопросе / ответе1

template<typename T>
struct Foo { };

template<typename T>
void Do(T&) { }

template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
BOOST_STATIC_ASSERT(false);
}

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

2

Другие решения


По вопросам рекламы [email protected]