任何人都可以从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标准草案的这一段吗?
在这些陈述中添加此内容的实际含义是什么?
任何人都可以借助示例/程序来解释这个吗?
答案 0 :(得分:6)
一般而言,翻译单位不得超过一个 任何类类型的定义。在这 例如,该类的两个定义 类型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)
所有它的含义是,如果你以一种需要定义的方式使用类类型(并且它们明确地列出了使用类的方法),你必须提供这种类的一个定义。
如果您没有提供定义,那就是错误。如果您在翻译单元中提供多个,那就是错误。如果您在多个翻译单元中提供多个定义,则它是未定义的行为。