为什么/如何基类的虚拟化改变了复制构造函数的行为?

时间:2013-08-02 14:02:26

标签: c++ c++11

我不明白这段代码的行为:(用clang ++ 3.0编译)

#include <iostream>

using namespace std;

class Base {
public:
    virtual void bar() {}

    bool foo = false;
};

class Derived : public Base{
public:
    Derived() { Base::foo = true; }
};

int main() {
    Derived d;
    Base b(d);

    cout << b.foo << endl; // prints 0
                           // prints 1 if "virtual void bar() {}" is removed

}

为什么Base :: bar()函数对复制Base :: foo有什么影响?

1 个答案:

答案 0 :(得分:6)

您的问题看起来与llvm项目的官方bugzilla中的reported as a bug here类似。

正如您所看到的是一个公认的错误并且已经在较新版本的Clang中进行了修补,您应该切换到更新版本的前端来解决此问题;在bug报告中还指定了为此问题提供补丁的clang的确切修订版。