为什么可以通过构造函数传递临时值来为引用分配临时值?
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
退出的原因:通过返回对它的右值引用来指定可以从非临时对象移动。
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
退出的原因:通过返回对它的右值引用来指定可以从非临时对象移动。