Перемещение по lvalue сломано / незакончено в msvc2010? - PullRequest
1 голос
/ 08 апреля 2011

Я не знаю, почему этот код не работает.this_ отображается как 0xcccccccc, а v больше 4. Почему?

Примечание. Я пытаюсь использовать семантику lvalue / move.

struct AA{
    void*this_;
    int v;
    AA() {v=4;this_=this; }
    AA(AA&a){this_=this; }
    AA(AA&&a){
        this_=a.this_;
        v = a.v;
    }
};
void movetest(AA s) {}
void movetest(AA& s) {}
//void movetest(AA&& s) {}
AA&& movetest() { return AA(); }
void MyTestCode2(){
    AA c = movetest();
    printf("wron value. 4 !='%d'\n", c.v);
}

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

Это возвращает ссылку на местный. Должно быть

AA movetest() { return AA(); }

Этот код требует наличия конструктора перемещения или копирования, но MSVC будет использовать оптимизацию возвращаемого значения и фактически не будет вызывать либо. В общем, вы должны проектировать свои объекты так, как если бы движения или копии происходили вне вашего контроля - просто поддерживайте согласованное состояние вашего объекта, не полагайтесь на их побочные эффекты.

VC2010 правильно предпочитает перемещение для копирования, например, при отладочной сборке

AA movetest () { AA a; вернуть; }

вызывает конструктор AA (AA &&), а не конструктор AA (AA &&).

1 голос
/ 08 апреля 2011

Дополнительная информация: Это ответ, а не комментарий только из-за проблем с форматированием.

Предупреждение было бы неплохо, но не требуется языком.Попробуйте вернуть локальное lvalue с помощью AA & и посмотрите, получите ли вы предупреждение.

clang ++ выдает следующее предупреждение для вашего кода:

test.cpp:14:26: warning: returning reference to local temporary object
AA&& movetest() { return AA(); }
                         ^~~~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...