5

emplace() とその友人に関する細かい点の 1 つが欠けているに違いありません。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()。の であるため、それは問題ではありませFooん。friendBar

于 2016-06-11T20:47:00.180 に答える