переместить семантику и время жизни переменных при привязке lvalue к ссылке на rvalues - PullRequest
3 голосов
/ 29 июля 2011

просто чтобы быть уверенным, что вы хорошо понимаете, что находится под капотом ... вопросы в коде в виде комментариев

   void test(int && val)
    {
        val=4;
    }//val is  destroyed here ?

int main()
{  
    int nb;
    test(std::move(nb));
    //undefined behavior if I reference here nb ?
    std::cout << nb;
    nb=5;
    std::cin.ignore();    
}

Ответы [ 6 ]

3 голосов
/ 29 июля 2011

Перемещенное значение остается в допустимом, но неопределенном состоянии. На самом деле это означает, насколько я знаю, что оно может содержать любое значение, но оно должно содержать некоторое значение, и доступ к нему является допустимым и определенным поведением.

3 голосов
/ 29 июля 2011

Вы должны понимать, что ссылка на какое-либо значение магическим образом не перемещает значение. Все, что он делает, это делает возможным получение неконстантной ссылки на временные объекты.

Эта ссылка в вашем примере не отличается от обычной ссылки, потому что у вас нет временных данных здесь. Вы тот, кто должен сделать «движение».

например. если вы определили, что ваш int пуст, когда он имеет значение 0, и вы пишете функцию, которая принимает ссылку на rvalue, использует ее и устанавливает переданное значение равным 0, то вы «переместили» предыдущее значение из вашего инт. После вызова этой функции она будет содержать 0. Но это потому, что вы определили это так.

Теперь для целых чисел это не имеет особого смысла, но представьте, что вы обрабатываете указатель на большой кусок памяти.

1 голос
/ 29 июля 2011

Это не неопределенное поведение, потому что вы никогда не переходите от val в своей функции.std::move просто превращает nb в значение.Это на самом деле имеет смысл, только если у вас есть неоднозначные перегрузки test.

0 голосов
/ 29 июля 2011

Хорошее объяснение по std :: move смотрите здесь . Если вы не начнете использовать конструктор перемещения, вы не сможете эффективно использовать эту новую функцию. Кроме того, я не думаю, что это имеет какой-либо смысл для примитивных типов, где копирование не требует дополнительных затрат.

0 голосов
/ 29 июля 2011

Преимущественно ссылки на rvalue полезны для вас, когда вы пишете новый класс, в котором вы заботитесь о стоимости его копирования и хотите написать конструктор перемещения.

Использование чужого конструктора перемещения (так долгокак это хорошо продумано) будет в значительной степени невидимым для вас.

например Когда добавление конструктора перемещения и оператора назначения перемещения действительно начнёт иметь значение?

Так что, если вы хотите изучить семантику перемещения, я предлагаю вам создать пример кода с использованием конструктора перемещения.

0 голосов
/ 29 июля 2011
//val is  destroy here ?

Тот же ответ, как если бы тип параметра был const int& val.

//undefined behavior if I reference here nb ?

Нет.Однако распечатанное значение не указано.Это отличается от «неопределенного поведения», которое может означать, что все может произойти.Если бы это было неопределенное поведение, это означало бы, что ваш диск мог бы быть переформатирован.

...