温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - Why is it possible to assign a temporary value to a reference by passing it via the constructor?
c++ design-patterns pointers reference move

c++ - 为什么可以通过构造函数传递给引用一个临时值呢?

发布于 2020-04-13 11:23:15
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

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

这是否会由于分配临时变量“ 100”而延长其寿命?这有多安全?临时值何时会被范围破坏?

查看更多

提问者
genaray
被浏览
105
Nicol Bolas 2020-02-03 03:33

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

如果违反了这些期望,您将遭受后果。

右值引用不一定是“临时对象”。它可以是可以从其移动的任何对象的引用。这就是为什么std::move退出的原因:通过向其返回右值引用来指定可以从非临时对象中移出。