5

移動のセマンティクスを理解するために、次のコードを書きました。g++-4.6 では期待どおりに動作しますが (コピーなしで移動のみ)、g++-4.7.0 では動作しません。これは g++-4.7.0 のリンクのバグだと思いましたが、このリンクは g++-4.7 のバグではないと言っています。したがって、上記のリンクから私が理解しているように、移動コンストラクターをスローしませんでしたが、それでもコピーのみを行います。ただし、コピー コンストラクターを nothrow にすると、移動のみが行われます。誰でもこれを説明できますか?

#include <iostream>
#include <vector>
using namespace std;

struct S{
int v;
static int ccount, mcount;
S(){}
    //no throw constructor
    //S(nothrow)(const S & x){
S(const S & x){
    v = x.v;
    S::ccount++;
}
S(S&& x){
    v = x.v;
    S::mcount++;
}
};

int S::ccount = 0;
int S::mcount = 0;
int main(){

vector<S> v;
S s;

for(int i = 0; i < 10; i++) {
    v.push_back(std::move(s));
}

cout << "no of moves = " << s.mcount << endl;
cout << "no of copies = " << s.ccount << endl;
return 0;
}
4

1 に答える 1

5

どのように「ムーブコンストラクターをスローにする」のですか? g++ 4.7 では、移動コンストラクターに注釈を付けるとnoexcept、例は移動のみを行います。

S(S&& x) noexcept{ ... }

no of moves = 25
no of copies = 0
于 2012-04-20T06:34:04.840 に答える