вектор, семантика перемещения, nothrow и g++ 4.7

Я написал следующий код, чтобы понять семантику перемещения. Он работает как положено (, т.е. не копирует и только перемещает )в g++ -4.6, но не в g++ -4.7.0. Я думал, что это ошибка в связывании в g++ -4.7.0, но эта ссылка говорит, что это не ошибка в g++ -4.7. Итак, как я понял из приведенной выше ссылки, я сделал конструктор перемещения не бросающим, но все же он делает только копии. Однако, если я сделаю конструктор копирования nothrow, места будут только перемещения. Кто-нибудь может это объяснить?

#include 
#include 
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 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;
}

5
задан R. Martinho Fernandes 20 April 2012 в 13:00
поделиться