g++ 4.9.3 抱怨 friended ctor 对 .emplace_back() 是私有的,但喜欢 .push_back()
g++ 4.9.3 complains that friended ctor is private with .emplace_back(), but likes .push_back()
我一定遗漏了关于 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;
};
在emplace_back
中,容器是构造Bar
的容器。但是那个构造函数是私有的,容器不是朋友,所以它失败了。
但是push_back(*this)
等同于push_back(Bar(*this))
。即是Foo
在施工,是朋友
bars.emplace_back(*this);
将对构造函数 Bar(Foo&)
的调用延迟到 std::vector::emplace_back()
。该函数没有调用 Bar(Foo&)
.
的访问权限
另一方面,
bars.push_back(*this);
在调用 std::vector::push_back()
之前调用构造函数 Bar(Foo&)
。这不是问题,因为 Foo
是 Bar
的 friend
。
我一定遗漏了关于 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;
};
在emplace_back
中,容器是构造Bar
的容器。但是那个构造函数是私有的,容器不是朋友,所以它失败了。
但是push_back(*this)
等同于push_back(Bar(*this))
。即是Foo
在施工,是朋友
bars.emplace_back(*this);
将对构造函数 Bar(Foo&)
的调用延迟到 std::vector::emplace_back()
。该函数没有调用 Bar(Foo&)
.
另一方面,
bars.push_back(*this);
在调用 std::vector::push_back()
之前调用构造函数 Bar(Foo&)
。这不是问题,因为 Foo
是 Bar
的 friend
。