【问题标题】:What is an unnamed type in C++?什么是 C++ 中的未命名类型?
【发布时间】:2011-07-05 03:20:32
【问题描述】:

在阅读 C++ 标准 ANSI ISO IEC 14882 2003 时,我发现了以下内容:

14.3.1.2:本地类型、无链接类型、未命名类型或类型 由这些类型中的任何一种复合而成 不得用作 模板的模板参数 类型参数。

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

【问题讨论】:

  • "C++ 标准上的厕所阅读"o_O

标签: c++ templates types standards


【解决方案1】:

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

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)

【讨论】:

  • @Kirakun:是的——结构和类基本相同。您也可以通过工会拥有相同的东西。
  • @Kirakun:是的,structclass are essentially the same。另外:enum { unnamed = 0 };.
  • 如果class 未命名,你如何定义它的构造函数?
  • -1 因为不质疑权威。 ;-) 例如int* 在我写这篇文章时根据您的定义是一个未命名的类型,但可以使用模板参数。重新信任权威(标准),关于具有未命名类型成员的命名类类型还有一个更微妙的问题。 DR #62 解决了这个更微妙的问题,它(政治?)没有提到更明显的术语问题,但其提议的解决方案解决了这两个问题。无论如何,在 N3126 中,文本已被删除,替换为非规范示例。
  • @Gman:这不是一个真正的答案。答案说您不能使用 int* 作为模板参数。你可以。
【解决方案2】:

想想下面的代码:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 2015-11-13
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2015-09-05
    相关资源
    最近更新 更多