c++ - `xvalue` C++11/14 中的行为

标签 c++ c++11 c++14 xvalue

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函数中,Wrapobjxvalue,所以我可以为它的任何成员赋值(xvalue - 即将过期!!)
2)xvalue的存储是什么?这不是自动存储吗?
3)当xvalue变成glvalue以及当它变成rvalue时。(上面上下文中的任何例子都会让我清楚这一点)。

最佳答案

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

我认为您混淆了变量的声明类型与由变量名称组成的表达式的类型和值类别。

decltype(Wrapobj) 给出 MyClass&&。当有人说“Wrapobj 是右值引用”时,他们正在谈论声明的类型。但是,当在表达式中使用 Wrapobj 时,它具有类型 MyClass 和值类别 lvalue

不存在具有引用类型的表达式。而且表达式的类型和值类别与表达式是否表示临时对象没有直接关系。

对于你的问题2:“xvalue”是表达式的值类别。表达式没有存储空间。对象有存储空间。引用可能会或可能不会使用存储(未指定)。请务必区分引用的存储和它所引用的对象的存储。

GetObj() 的返回值是一个临时对象。尽管常见的实现使用堆栈(类似于自动对象),但该标准实际上并未指定临时对象的存储持续时间。我认为 C++17 可能正在改进该领域标准的措辞。

关于c++ - `xvalue` C++11/14 中的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40450988/

相关文章:

c++ - C++ 中的 GTK : Changing a Label based on console input

c++ - 带for循环的递归函数: return value issue

c++ - log4cpp: Linux 找不到 lib 文件

c++ - 如何删除属于 vector 中存储的对象的指针?

c++ - 部分特化的模板子类化

c++ - 更新控制台 C++ 上打印的值

C++ 外部存储类生命周期

c++ - lambda 到 curl 回调函数

c++ - std::chrono::system_clock 与 std::chrono::high_resolution_clock 行为

c++ - 在 Ubuntu 16.04 下构建 Proxygen