为啥可以通过构造函数将临时值分配给引用?
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:它会引发临时对象的创建。以上是关于为啥可以通过构造函数将临时值分配给引用?的主要内容,如果未能解决你的问题,请参考以下文章