什么是C++中的未命名类型?

kir*_*kun 13 c++ standards templates types

作为我在C++标准ANSI ISO IEC 14882 2003上阅读厕所的一部分,我遇到了以下内容:

14.3.1.2:本地类型,没有链接的类型,未命名的类型或从这些类型中的任何类型复合的类型不得用作模板类型参数的模板参数.

虽然我得到的是本地类型和复合类型,但什么是未命名的类型?如果一个类型未命名,你怎么能尝试在模板中使用它,这促使标准口头排除它?

Jam*_*lis 22

"未命名类型"实际上意味着"未命名的枚举或类类型"[有关更多信息,请参阅此答案的注释].枚举或类类型不必具有名称.例如:

struct { int i; } x; // x is of a type with no name
Run Code Online (Sandbox Code Playgroud)

您可以尝试通过参数推导使用未命名的类型作为模板参数:

template <typename T> void f(T) { }

struct { int i; } x;
f(x); // would call f<[unnamed-type]>() and is invalid in C++03
Run Code Online (Sandbox Code Playgroud)

请注意,此限制已在C++ 0x中解除,因此这是有效的(您还可以使用本地类型作为类型模板参数).在C++ 0x中,您还可以使用decltype"命名"未命名的类型:

template <typename T> void g() { }

struct { int i; } x;
f<decltype(x)>(); // valid in C++0x (decltype doesn't exist in C++03)
Run Code Online (Sandbox Code Playgroud)

  • @Kirakun:是的 - 结构和类基本相同.你也可以和工会做同样的事情. (2认同)
  • @Kirakun:是的,`struct`和`class` [基本相同](http://stackoverflow.com/questions/92859/what-are-the-differences-between-struct-and-class-in-c/999810#999810).另外:`enum {unnamed = 0};`. (2认同)