【问题标题】:about vs/g++ with copy-constructor关于带有复制构造函数的 vs/g++
【发布时间】:2012-03-25 07:24:31
【问题描述】:

我正在尝试在 Visual Studio (2008) 和 g++ 中编译代码。
在vs2008中是成功的,但是在g++中却报错了。
如果添加const,
test(const test &source):a(source.a) {}
g++ 会编译成功。
我知道test aa = 2; 将创建一个临时对象并调用复制构造函数。
临时对象不能绑定到非常量引用
那么,为什么vs2008可以编译成功呢?

class test{  
public:  
    test():a(1) {}  
    test(int num):a(num) {}
    test(test &source):a(source.a) {}  
private:
    int a;
};

int main(){
    test aa = 2;
    return 0;
}

【问题讨论】:

    标签: c++ visual-studio-2008 g++ copy-constructor


    【解决方案1】:

    不幸的是,VS 有一个非标准的扩展允许它。

    有一个编译器标志可以禁用扩展,但最后我检查了它也使得无法使用标准库。最好的办法是将警告级别保持在 4(尽管这种特殊情况不会发出警告),并尽可能使用多个编译器检查您的编译。

    【讨论】:

    • 不幸的是,没有警告。 /Za 将禁用非标准行为,但不建议使用 /Za。
    • @JamesMcNellis:啊,你是对的,即使使用/Wall(无论如何基本上都无法使用)。它确实警告test aa = test(2);,这是它应该生成的,但可惜不是。
    • @JamesMcNellis:我发现 vs 不调用复制构造函数,它调用test(int num)
    • @skeu:是的,它错误地实现了T x = y; 形式的初始化。这假设相当于T x = T(y);,然后编译器可以优化为T x(y);,但它必须这样做好像它制作了副本(即:复制构造函数必须是可访问的)。 VS 不这样做,它只是直接转到T x(y) 无论如何。
    • @GManNickG:谢谢。我用/Od拒绝优化,但效果不好。
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2016-04-08
    • 2013-01-10
    • 1970-01-01
    • 2016-03-11
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多