5

我一定错过了关于 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;
};
4

2 回答 2

10

emplace_back中,容器是构造Bar. 但是那个构造函数是私有的,容器不是朋友,所以它失败了。

push_back(*this)相当于push_back(Bar(*this))。也就是说,它是在Foo做建设,它是一个朋友。

于 2016-06-11T20:46:53.490 回答
2
    bars.emplace_back(*this);

将对构造函数的调用延迟Bar(Foo&)std::vector::emplace_back(). 该函数没有调用的访问权限Bar(Foo&)

另一方面,

    bars.push_back(*this);

Bar(Foo&)在调用之前调用构造函数std::vector::push_back()。这不是问题,因为FoofriendBar

于 2016-06-11T20:47:00.180 回答