8

可能重复:
std::string x(x);

class A {};

int main() {

    A a(a);
}

这编译。

gcc (GCC) 4.7.2 20120921 (红帽 4.7.2-2)
g++ -o main main.cpp -Wall -w -ansi

我没有收到任何警告。

为什么这似乎是有效的 C++?
标准中的任何地方都提到了这一点吗?
是否有可以为 gcc 报告此问题的警告标志?

当类有成员数据时,数据最终是随机的。
例子:

#include <iostream>

class A {

public:
    int i;
    A() : i{6} {}
};

int main() {

    A a(a);
    std::cout << a.i << '\n';
}

输出:-482728464

这里发生了什么?另外,我怎样才能防止自己不小心这样做呢?- 是否有可能使其成为编译器错误?

4

1 回答 1

10

(第 3.3.2/1 节)名称的声明点紧接在其完整声明符(第 8 条)之后和其初始化器(如果有)之前,除非下文另有说明。[ 例子:

int x = 12;
{ int x = x; }

这里第二个 x 用它自己的(不确定的)值初始化。—结束示例]

这也适用于用户定义的类型,例如 your class A。使用的复制构造函数是默认的,由编译器自动生成。

于 2012-10-09T01:37:36.417 回答