class Myclass
{
public:
    Myclass() = default;
    ~Myclass() = default;
    Myclass(Myclass&&) = default;
    Myclass& operator=(Myclass&&) = default;

    Myclass(const Myclass&) = delete;

    Myclass& operator=(const Myclass&) = delete;
    int i = 0;
};

Myclass GetObj()
{
    Myclass obj;
    return obj;
}

Myclass WrapperOfGetObj()
{
    Myclass&& Wrapobj = GetObj();
    Wrapobj.i = 1; // Will it work?

    return std::move(Wrapobj);
}

int main()
{
    return 0;
}

我有几个问题:
1)在WrapperOfGetObj函数中,Wrapobj xvalue ,因此我可以将值分配给它的任何成员(xvalue-即将到期!)
2)xvalue的存储空间是多少?这不是自动存储吗?
3)当xvalue变成glvalue时,当它变成rvalue时(以上上下文中的任何示例都会使我明白这一点)。

最佳答案

表达式Wrapobj是一个左值。所有命名变量都是左值。

我认为您在变量的声明类型与由变量名称组成的表达式的类型和值类别之间混在一起。
decltype(Wrapobj)给出MyClass&&。当有人说“Wrapobj是右值引用”时,他们正在谈论声明的类型。但是在表达式中使用Wrapobj时,其类型为MyClass和值类别lvalue

没有引用类型的表达式。同样,表达式的类型和值类别与表达式是否表示临时对象也不直接相关。

对于您的问题2:“xvalue”是表达式的值类别。表达式没有存储空间。对象具有存储空间。引用可以使用也可以不使用存储(未指定)。确保区分引用的存储和引用对象的存储。
GetObj()的返回值是一个临时对象。尽管通常的实现使用堆栈(类似于自动对象),但该标准实际上并未指定临时对象的存储期限。我认为C++ 17可能正在改进该 Realm 的标准措辞。

10-08 19:37