为什么可以通过构造函数传递临时值来为引用分配临时值?

Why is it possible to assign a temporary value to a reference by passing it via the constructor?

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

我最近发现可以通过滥用右值语义将临时值分配给 class 中的引用... 但为什么这可能呢?记忆如何表现?

这是否会因为赋值而延长临时变量“100”的生命周期? 这有多安全?临时值何时被范围破坏?

这是可能的,因为 C++ 不是一种安全的语言;它希望您知道自己在做什么。如果您采用右值引用参数,它希望您知道自己在用它做什么。如果您将其存储为对象的引用成员,它希望您确保被引用的对象将在该对象需要它时继续存在。

如果您违背了这些期望,后果自负。

右值引用不一定是 "temporary object"。它可以是对可以移动的任何对象的引用。这就是 std::move 退出的原因:通过返回对它的右值引用来指定可以从非临时对象移动。