使用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)引用作为类成员。)
答案 0 :(得分:1)