Почему можно назначить временное значение для ссылки, передав его через конструктор? - PullRequest
1 голос
/ 02 февраля 2020
class MoveSemantic{

public:

// For inserting a value
MoveSemantic(short &value);
MoveSemantic(short &&value);

short &storedValue;

};

// Reference forced to initialize
MoveSemantic::MoveSemantic(short &value) : storedValue(value) {}
MoveSemantic::MoveSemantic(short &&value) : storedValue(value) {}

// Passing a RValue => Assiging to reference => Is this safe ?
MoveSemantic semantik(100);
cout << semantik.storedValue; // 100

Недавно я обнаружил, что можно присвоить временное значение ссылке внутри класса, злоупотребив семантикой rvalue ... Но почему это возможно? Как ведет себя память?

Увеличивает ли это время жизни временной переменной "100" из-за ее присваивания? Насколько это безопасно? И когда временное значение уничтожается областью действия?

1 Ответ

4 голосов
/ 02 февраля 2020

Это возможно, потому что C ++ не является безопасным языком; он ожидает, что вы будете знать, что делаете. Если вы берете ссылочный параметр rvalue, он ожидает, что вы знаете, что вы делаете с ним. Если вы сохраните это как ссылочный член объекта, он ожидает, что вы обеспечите, чтобы объект, на который ссылаются, продолжали существовать до тех пор, пока этот объект нуждается в этом.

И если вы нарушите эти ожидания , вы страдаете от последствий.

Ссылка на значение не обязательно является «временным объектом». Это может быть ссылка на любой объект, с которого можно двигаться. Вот почему std::move выходит: для обозначения того, что можно перейти от невременного объекта, возвращая на него ссылку на значение.

...