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

【问题讨论】:

    标签: c++ pointers design-patterns reference move


    【解决方案1】:

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

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

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

    【讨论】:

    • 100,那里,真的是临时的吗?
    • @Jeffrey:它会引发临时对象的创建。
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2014-02-01
    相关资源
    最近更新 更多