调用正在创建实例的复制构造函数

时间:2011-09-22 16:43:34

标签: c++ visual-c++

我不是在问这样一个调用的逻辑,而是我对支持b / w Visual C ++和GCC / Clang的不同感兴趣。 Visual C ++不允许将对象的新实例用作其自己的复制构造函数的参数。 GCC和Clang允许这样做。考虑到'int i = i;'允许,我想知道Visual C ++是否有错误。

class test {
private:
    test() {}
public:
    test(const test& t) {}
};

int main(void) {
    int i = i;
    test t(t); -- this line gives an error in Visual C++
    return 0;
}

2 个答案:

答案 0 :(得分:2)

引用C ++标准(3.3.2):

  

名称的声明位于其完整声明符之后及其初始值设定项之前

在您的第一个语句中,声明符在int i之后结束,因此名称i在初始值设定项(= i)中使用时可用,因此声明格式正确,但其行为未定义。

在你的第二个陈述中,声明者在test t(t)之后结束,并且没有初始化器;在您使用它的地方,名称t ,因此声明格式不正确。

因此编译器的行为正确。我希望它可以配置为对第一个语句发出警告,但不要求拒绝它;正如你所说的,它需要拒绝第二个。

答案 1 :(得分:0)

 test t(t); -- this line gives an error in Visual C++ 

你在哪里定义了?编译器不是物理的!