【问题标题】:Can anyone explain this paragraph of the current C++0x standard draft? [closed]谁能解释当前 C++0x 标准草案的这一段? [关闭]
【发布时间】:2011-04-11 13:33:21
【问题描述】:

谁能从 ISO N3242 §3.2 第 4 点解释这个声明

n3242 与 ISO 标准 2003 相比的新增部分:

类类型T必须是完整的,如果:

  • 声明了T 类型的非静态类数据成员 (9.2),或者
  • T 用作 new-expression 中的对象类型或数组元素类型
  • T 类型是 alignof 表达式 (5.3.6) 的主题,或者
  • 异常声明的类型为T,引用T,或指向T 的指针

谁能解释当前 C++0x 标准草案的这一段?

在这些语句中添加这个的实际含义是什么?

任何人都可以借助示例/程序来解释这一点吗?

【问题讨论】:

  • 您对这一段有什么困惑?这是您在短时间内关于 ODR 段落的第三个问题。您有更广泛的问题,还是有一些让您感到困惑的总体问题?这个特定的段落非常简单:它列出了需要完整类型的场景。你不知道什么是完整类型吗?您不了解其中一种情况吗?
  • @James:我正在尝试检查每一点......他们所说的......在c ++ 0x中。我有些不清楚......所以我正在寻求像你这样的程序员的帮助....
  • 对,但你的问题是什么?这一段的哪一部分令人困惑?如果您发现引用的文本令人困惑,您可以从 a good introductory or reference C++ text 开始,而不是从标准草案开始。 C++ 标准非常密集。理解一个段落通常还需要理解另外 30 个段落,所有这些相关段落之间的相互关系并不总是很明显。
  • @James:以上几点如何证明是正确的......是的,你说的是对的。这就是我试图通过各种编程示例证明来理解每一点。所以如果我是无法证明我正在寻求帮助,并且我试图从帮助中理解那些......通过再次证明......
  • 我强烈反对这个计划:买一本好的入门书来学习基础知识,买一两本参考书来更深入地学习语言。只有在您拥有良好的语言基础之后,您才应该开始研究 C++ 标准中的内容。这不是一个容易阅读的文本。由于您无法澄清您感到困惑的内容,因此除了“阅读标准的其余部分以在上下文中理解本段”之外,没有人可以回答这个问题。因此,这个问题不符合 Stack Overflow 上真正问题的标准。

标签: c++ c++11 standards one-definition-rule


【解决方案1】:

Straight from Wikipedia:

一般来说,一个翻译单元应包含不超过一个 任何类类型的定义。在这 例如,类的两个定义 C型出现在同一个翻译中 单元。这通常发生在 头文件被包含两次 相同的源文件没有适当的 头后卫。

class C {}; // first definition of C
class C {}; // error, second definition of C

n 下面,形成一个指向 S 或定义一个函数 参考 S 是合法的例子 构造,因为它们不 要求 S 的类型是完整的。 因此,定义不 必填。

定义一个 S 类型的对象,a 函数接受类型为 S 的参数, 或在 sizeof 表达式中使用 S 是 S 必须是的上下文示例 完整的,因此需要一个 定义。

struct S;   // declaration of S
S * p;      // ok, no definition required
void f(S&); // ok, no definition required
void f(S);  // ok, no definition required 
S f();      // ok, no definition required  

S s;        // error, definition required
sizeof(S);  // error, definition required

不止一个定义

在某些情况下,可能会有更多 比一个类型或一个定义 模板。一个程序包括 多个头文件和源文件 通常会有不止一个 类型的定义,但不是更多 每个翻译一个定义 单位。

如果一个程序包含多个 定义一个类型,然后每个 定义必须是等价的。

静态 const 数据成员的定义

在准标准 C++ 中,所有静态数据 成员需要外部定义 他们班的。然而,期间 C++ 标准化过程 决定取消这项要求 静态 const 整数成员。这 意图是允许以下用途:

struct C
{
  static const int N = 10;
};
char data[C::N]; // N "used" without out-of-class definition

没有 N 的命名空间范围定义。

尽管如此,1998 年 C++ 标准的措辞仍然需要 定义成员是否用于 该程序。这包括 成员出现在任何地方,除了 sizeof 或 typeid 的操作数, 有效地使上述 格式不正确。

这被确定为缺陷,并调整了措辞以允许 这样的成员出现在任何地方 需要常量表达式, 无需课外 定义。这包括数组 边界,案例表达式,静态 成员初始化器和非类型 模板参数。

struct C
{
  static const int N = 10;
  static const int U = N; // Legal per C++03
};

char data[C::N]; // Legal per C++03

template<int> struct D;

template<> struct D<C::N> {}; // Legal per C++03

但是,使用静态 const 积分 任何地方的成员,除了 积分常数表达式是 required 需要定义

struct C
{
  static const int N = 10;
};

int main()
{
  int i = C::N; // ill-formed, definition of C::N required
}

此要求将在 即将到来的 C++ 标准, 通俗地称为 C++0x。

【讨论】:

  • @0AOD:哇,感谢 q 的编辑。我已经看到了。我正在询问以上点的确切含义
  • @1User:如果你能澄清一下你到底有什么不明白的地方,我也许可以提供帮助
【解决方案2】:

它的意思是,如果您以需要定义的方式使用类类型(并且他们明确列出了使用类的方式),则必须提供该类的确切定义。

如果您不提供定义,那就是错误。如果您在翻译单元中提供多个,则为错误。如果您在多个翻译单元中提供多个定义,则属于未定义行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2020-07-16
    • 2011-09-01
    • 2017-04-22
    相关资源
    最近更新 更多