作为我在C ++标准ANSI ISO IEC 14882 2003上阅读马桶的一部分,我遇到了以下内容:
14.3.1.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中是不同的。