我必须错过关于emplace()和朋友的一个更好的观点。这是一个用g ++ 4.9.3重现问题的完整的最小例子:
class Foo
{
public:
class Bar
{
private:
friend class Foo;
Bar(Foo &foo) : foo(foo) {}
Foo &foo;
};
Bar &getBar()
{
//bars.push_back(*this); // works fine
bars.emplace_back(*this); // Foo::Bar::Bar(Foo&) is private
return bars.back();
}
private:
std::vector<Bar> bars;
};
答案 0 :(得分:10)
在emplace_back
中,容器是构造Bar
的容器。但是那个构造函数是私有的,容器不是朋友,所以它失败了。
但push_back(*this)
相当于push_back(Bar(*this))
。也就是说,它正在构建Foo
并且它是朋友。
答案 1 :(得分:2)
bars.emplace_back(*this);
将对构造函数Bar(Foo&)
的调用延迟到std::vector::emplace_back()
。该函数没有调用Bar(Foo&)
的访问权限。
另一方面,
bars.push_back(*this);
在调用Bar(Foo&)
之前调用构造函数std::vector::push_back()
。这不是问题,因为Foo
是friend
的{{1}}。