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 可能正在改进该领域标准的措辞。
关于c++ - `xvalue` C++11/14 中的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40450988/