我有这个:
#include <iostream>
#include <vector>
class B
{
public:
std::string s;
B()
{
std::cout<<"constructing B"<<std::endl;
}
~B()
{
std::cout<<"destroying B"<<std::endl;
}
};
class A
{
private:
void Do(std::vector<B>& v)
{
B b;
b.s = "this is a test";
v.push_back(b);
}
public:
void Check()
{
std::vector<B> v;
Do(v);
std::cout<<v[0].s<<std::endl;
}
};
int main()
{
A a;
a.Check();
}
问题:这很有效,所以显然编译器知道b
不应该超出范围,但这是用v
内部创建的对象填充向量Do
的好方法吗?
以上的输出是
constructing B
destroying B
this is a test
destroying B
这是正确的,假设b
被复制,那么旧的值被破坏并且更新的传递在向量中了吗?
答案 0 :(得分:1)
向量存储本地对象b的副本。因此,相对于此局部变量的代码没有问题
答案 1 :(得分:1)
push_back
将b
复制到为v
创建的新元素中,然后在b
返回之前销毁Do
。