为啥可以通过构造函数将临时值分配给引用?

Posted

技术标签:

【中文标题】为啥可以通过构造函数将临时值分配给引用?【英文标题】:Why is it possible to assign a temporary value to a reference by passing it via the constructor?为什么可以通过构造函数将临时值分配给引用? 【发布时间】:2020-02-02 19:22:13 【问题描述】:
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”的生命周期? 这有多安全?临时值什么时候被作用域破坏?

【问题讨论】:

【参考方案1】:

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

如果您违反这些期望,您将承担后果。

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

【讨论】:

100,那里,真的是临时的吗? @Jeffrey:它会引发临时对象的创建。

以上是关于为啥可以通过构造函数将临时值分配给引用?的主要内容,如果未能解决你的问题,请参考以下文章

将临时右值绑定到 std::vector 构造函数中的引用左值

传递给构造函数的临时对象的 C++ 寿命

为啥在按值返回时总是调用复制构造函数

通过引用传递给构造函数

右值引用剖析

为啥定义复制构造函数会给我错误:不能将'obj&'类型的非常量左值引用绑定到'obj'类型的右值?