Pertanyaan g ++ 4.9.3 mengeluh bahwa kawan yang bersahabat adalah pribadi dengan .emplace_back (), tetapi suka .push_back ()


Saya harus kehilangan salah satu poin penting tentang emplace () dan teman-teman. Berikut ini contoh lengkap dan lengkap yang mereproduksi masalah dengan 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;
};

5
2018-06-11 20:41


asal


Jawaban:


Di emplace_back, wadah adalah yang membangun Bar. Tetapi konstruktor itu bersifat pribadi dan wadahnya bukan teman, jadi gagal.

Tapi push_back(*this) setara dengan push_back(Bar(*this)). Itu adalah, itu Foo yang melakukan konstruksi dan itu adalah teman.


10
2018-06-11 20:46



    bars.emplace_back(*this);

menunda panggilan ke konstruktor Bar(Foo&) untuk std::vector::emplace_back(). Fungsi itu tidak memiliki hak akses untuk menelepon Bar(Foo&).

Di samping itu,

    bars.push_back(*this);

memanggil konstruktor Bar(Foo&) sebelum panggilan ke std::vector::push_back(). Itu bukan masalah sejak Foo adalah friend dari Bar.


2
2018-06-11 20:47