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

时间:2011-02-27 05:52:51

标签: c++ templates types standards

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

  

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

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

2 个答案:

答案 0 :(得分:22)

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

struct { int i; } x; // x is of a type with no name

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

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

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

请注意,此限制已在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)

答案 1 :(得分:1)

考虑以下代码:

template <typename T>
void foo(const T&) {}

struct {
  int x;
} y;
foo(y);

包括未命名的类型。请注意,规则在C ++ 0x中是不同的。