使用`std :: vector`在显式构造函数中赋值`const reference`成员不是持久的

时间:2017-01-21 18:21:04

标签: c++ vector reference stl const

使用Dangerous implicit conversion in emplace的源代码我发现了以下行为:

struct Foo
{
public:
    explicit Foo(const int& i) : i(i) { 
        cout << "explicit int ctor called" << endl; }
    explicit Foo(const double& x) : i(i) { 
        cout << " explicit double ctor called // i : " << i << endl; }
    Foo(int&&) = delete; 
    Foo(double&&) = delete; 

    void foo() const { 
        cout << i << endl; }  
private:
    const int& i;
};

void bar(const double& d) {
    cout << "---------- create object vector ------------" << endl; 
    std::vector<Foo> fv;
    fv.emplace_back(d);
    fv[0].foo(); 

    cout << "---------- create object default ------------" << endl; 
    Foo f(d); 
    f.foo(); 
}

int main(){
    bar(5.0); 
    return 0; 
}

打印:

---------- create object vector ------------
explicit double ctor called // i : 5
0
---------- create object default ------------
explicit double ctor called // i : 5
5

因此,在两种情况下,引用成员在对象创建期间被正确初始化,由输出i = 1指示。但是在对两个对象调用foo()函数后,它们会产生不同的结果。从矢量中检索最近放置的对象打印0,甚至认为它应该打印1。另一个对象表现正确。

问题为什么在STL容器中放置时const引用成员的值不是持久的? (我对像&#34这样的建议不感兴趣;根本不使用(const)引用作为类成员。)

1 个答案:

答案 0 :(得分:1)

在这一行:

explicit Foo(const double& x) : i(i) {

会员参考i已自行初始化,causes undefined behaviour