局部类型在未实例化的函数中作为模板参数

Local type as template argument inside not instantiated function

本文关键字:参数 函数 类型 实例化 局部      更新时间:2023-10-16

局部类型作为模板参数在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);
}

在c++ 03中没有这样的指令,因为

    在c++ 03和中没有指令
  1. 规则没有用本地类型作为参数实例化模板是错误的,它说使用本地类型作为模板参数是错误的。

如果模板没有实例化,则不应该是成功的。

另一方面,一些编译器允许局部类型作为模板形参(例如Visual c++;不,它不符合标准,但这就是生活),所以你不能用它来强制编译失败。

如果在尝试某些组合时需要编译失败,请使用标准的静态断言。你可以使用Boost。静态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我不确定它是否正确;我认为即使没有实例化,实现也可能失败,除非参数在封闭模板中依赖于参数。