1

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);
}
4

1 回答 1

2

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我不确定它是否正确;我认为即使没有实例化,实现也可能会失败,除非参数在封闭模板中依赖于参数。

于 2014-06-19T10:04:37.893 回答