20

コピー コンストラクターを削除した型がありvector、この型が必要なため、 を介してすべての要素を作成する必要がありますemplace_back。ただし、コピー コンストラクターが削除されたためemplace_backにインスタンス化できないという警告がコンパイラによって表示されるため、コピー コンストラクターが必要なようです。emplace_backなぜコピーコンストラクターが必要なのですか? 何もコピーせずemplace_backに を構築することが全体のポイントだと思いました。コピー コンストラクターを持たないオブジェクトを作成することはできますかvector?vector

class MyType {
public:
    MyType(std::array<double, 6> a) {}
    MyType(const MyType& that) = delete;
};

int main() {
    std::vector<MyType> v;
    std::array<double, 6> a = {1,2,3,4,5,6};
    v.emplace_back(a);
}

コンパイラは clang/llvm です。

4

3 に答える 3

31

vector内部ストレージが大きくなると、要素を古いストレージから新しいストレージに移動する必要があります。コピー コンストラクターを削除することで、既定の移動コンストラクターも生成されなくなります。

于 2015-12-31T09:05:35.877 に答える
12

emplace_back を呼び出せるようにするには、型をEmplaceConstructibleまたはMoveInsertibleにする必要があります。コピー コンストラクターを削除した場合は、クラスにムーブ コンストラクターを指定する必要があります。( emplace_back の要件については、これを確認してください)

 MyType(MyType &&a) {/*code*/} //move constructor
于 2015-12-31T09:06:37.893 に答える
1

このコードを実行しようとすると:

// Example program
#include <iostream>
#include <string>
#include <array>
#include <vector>
class MyType {
public:
    MyType(std::array<double, 6> a) {
        std::cout<< "constructed from array\n";
        }
    MyType(const MyType& that){
          std::cout<< "copy\n";
    }

    MyType(MyType&& that){
          std::cout<< "move\n";
    }
};

int main() {
    std::vector<MyType> v;
    std::array<double, 6> a = {1,2,3,4,5,6};
    v.emplace_back(a);
}

次の結果が得られます。

配列から構築

ライブデモ

constructorfromだけstd::Arrayが呼び出されていることは明らかです。したがって、必要はありませんcopy constructor。しかし、同時に を実行deletedするcopy constructorと、コンパイラはエラーを発生させます (少なくとも 2 つのコンパイラで 最初に 2 番目に試しました)。copy constructoremplace_back を使用する場合、この実際のケースでは必要ない場合でもの存在をチェックするコンパイラもあれば、チェックしないコンパイラもあると思います。ここで何が標準なのかわかりません(どのコンパイラが正しいか間違っているか)。

于 2015-12-31T09:18:18.663 に答える