我必须错过关于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;
};
Run Code Online (Sandbox Code Playgroud)
Bar*_*rry 10
在emplace_back,容器是构建容器的容器Bar.但是那个构造函数是私有的,容器不是朋友,所以它失败了.
但push_back(*this)相当于push_back(Bar(*this)).也就是说,它Foo正在构建它并且它是朋友.