任何人都可以解释当前C ++ 0x标准草案的这一段吗?

时间:2011-04-11 13:33:22

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

任何人都可以从ISON3242§3.2,第4点

解释这一说法

与ISO Standard 2003相比,n3242的附加部分:

  

4如果以需要类类型完整的方式使用类,则翻译单元中只需要一个类的定义。

     

如果符合以下条件,则类型T必须完整:

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

任何人都可以解释当前C ++ 0x标准草案的这一段吗?

在这些陈述中添加此内容的实际含义是什么?

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

2 个答案:

答案 0 :(得分:6)

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 ++标准化过程   决定解除这个要求   static const integral members。该   意图是允许诸如以下的用途:

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

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

     

尽管如此,1998 C ++标准的措辞仍然需要a   定义是否使用该成员   该程序。这包括   成员出现在任何地方,除了   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积分   会员除了哪里以外的地方   积分常量表达式   要求需要一个定义

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

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

这项要求将放宽   即将推出的C ++标准,   通俗地称为C ++ 0x。

答案 1 :(得分:0)

所有它的含义是,如果你以一种需要定义的方式使用类类型(并且它们明确地列出了使用类的方法),你必须提供这种类的一个定义。

如果您没有提供定义,那就是错误。如果您在翻译单元中提供多个,那就是错误。如果您在多个翻译单元中提供多个定义,则它是未定义的行为。