g ++ 4.9.3抱怨说朋友与.emplace_back()是私密的,但是喜欢.push_back()

时间:2016-06-11 20:41:15

标签: c++ stl emplace

我必须错过关于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;
};

2 个答案:

答案 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()。这不是问题,因为Foofriend的{​​{1}}。