Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xvalue和prvalue之间的一些差异 最近我一直在仔细研究C++的CopgOrg.左值和右值之间的区别似乎很清楚,但当涉及prvalue和xvalue时,我感到困惑。 给出以下示例: #include <iostream> using std::cout; using std::endl; using std::move; class Type { public: int value; Type(const int &value=0) :value(value) {} Type(const Type &type) :value(type.value){} Type(Type &&type) noexcept :value(type.value) {} Type &operator= (const Type &type) { value = type.value; return *this; } Type &operator=(Type &&type) noexcept{ value = type.value; return *this; } }; Type foo1(const Type &value) { return Type(value); } Type &&foo2(const Type &value) { return Type(value); } int main() { Type bar1(123); cout << foo1(bar1).value << endl; cout << foo2(bar1).value << endl; Type bar2; bar2 = foo1(bar1); cout << bar2.value << endl; bar2 = foo2(bar1); cout << bar2.value << endl; return 0; } #包括 使用std::cout; 使用std::endl; 使用std::move; 类类型{ 公众: int值; 类型(const int&value=0):值(value){} 类型(consttype&Type):值(Type.value){} Type(Type&&Type)noexcept:value(Type.value){} 类型和运算符=(常量类型和类型){ value=type.value; 归还*这个; } 类型和运算符=(类型和类型)无例外{ value=type.value; 归还*这个; } }; 类型foo1(常量类型和值){ 返回类型(值); } 类型和foo2(常量类型和值){ 返回类型(值); } int main(){ bar1型(123); cout_C++_C++11_Lifetime_Xvalue_Prvalue - Fatal编程技术网

xvalue和prvalue之间的一些差异 最近我一直在仔细研究C++的CopgOrg.左值和右值之间的区别似乎很清楚,但当涉及prvalue和xvalue时,我感到困惑。 给出以下示例: #include <iostream> using std::cout; using std::endl; using std::move; class Type { public: int value; Type(const int &value=0) :value(value) {} Type(const Type &type) :value(type.value){} Type(Type &&type) noexcept :value(type.value) {} Type &operator= (const Type &type) { value = type.value; return *this; } Type &operator=(Type &&type) noexcept{ value = type.value; return *this; } }; Type foo1(const Type &value) { return Type(value); } Type &&foo2(const Type &value) { return Type(value); } int main() { Type bar1(123); cout << foo1(bar1).value << endl; cout << foo2(bar1).value << endl; Type bar2; bar2 = foo1(bar1); cout << bar2.value << endl; bar2 = foo2(bar1); cout << bar2.value << endl; return 0; } #包括 使用std::cout; 使用std::endl; 使用std::move; 类类型{ 公众: int值; 类型(const int&value=0):值(value){} 类型(consttype&Type):值(Type.value){} Type(Type&&Type)noexcept:value(Type.value){} 类型和运算符=(常量类型和类型){ value=type.value; 归还*这个; } 类型和运算符=(类型和类型)无例外{ value=type.value; 归还*这个; } }; 类型foo1(常量类型和值){ 返回类型(值); } 类型和foo2(常量类型和值){ 返回类型(值); } int main(){ bar1型(123); cout

xvalue和prvalue之间的一些差异 最近我一直在仔细研究C++的CopgOrg.左值和右值之间的区别似乎很清楚,但当涉及prvalue和xvalue时,我感到困惑。 给出以下示例: #include <iostream> using std::cout; using std::endl; using std::move; class Type { public: int value; Type(const int &value=0) :value(value) {} Type(const Type &type) :value(type.value){} Type(Type &&type) noexcept :value(type.value) {} Type &operator= (const Type &type) { value = type.value; return *this; } Type &operator=(Type &&type) noexcept{ value = type.value; return *this; } }; Type foo1(const Type &value) { return Type(value); } Type &&foo2(const Type &value) { return Type(value); } int main() { Type bar1(123); cout << foo1(bar1).value << endl; cout << foo2(bar1).value << endl; Type bar2; bar2 = foo1(bar1); cout << bar2.value << endl; bar2 = foo2(bar1); cout << bar2.value << endl; return 0; } #包括 使用std::cout; 使用std::endl; 使用std::move; 类类型{ 公众: int值; 类型(const int&value=0):值(value){} 类型(consttype&Type):值(Type.value){} Type(Type&&Type)noexcept:value(Type.value){} 类型和运算符=(常量类型和类型){ value=type.value; 归还*这个; } 类型和运算符=(类型和类型)无例外{ value=type.value; 归还*这个; } }; 类型foo1(常量类型和值){ 返回类型(值); } 类型和foo2(常量类型和值){ 返回类型(值); } int main(){ bar1型(123); cout,c++,c++11,lifetime,xvalue,prvalue,C++,C++11,Lifetime,Xvalue,Prvalue,foo2正在返回绑定到临时的引用,该引用立即被销毁;它总是返回一个挂起的 在return语句中,与函数返回值的临时绑定不会被扩展:它会在返回表达式末尾立即被销毁。此类函数始终返回悬空引用 取消对返回的引用的引用,如foo2(bar1).value和bar2=foo2(bar1);将导致UB;任何事情都是可能的 另一方面,foo1没有这样的问题。返回值是从临时对象移动的。foo2返回对局部变量的引用,该引用已被销毁。因此该引用是悬空的。它实际上与prvalues vsxvalues没有任何关系。您

foo2
正在返回绑定到临时的引用,该引用立即被销毁;它总是返回一个挂起的

在return语句中,与函数返回值的临时绑定不会被扩展:它会在返回表达式末尾立即被销毁。此类函数始终返回悬空引用

取消对返回的引用的引用,如
foo2(bar1).value
bar2=foo2(bar1);
将导致UB;任何事情都是可能的


另一方面,
foo1
没有这样的问题。返回值是从临时对象移动的。

foo2
返回对局部变量的引用,该引用已被销毁。因此该引用是悬空的。它实际上与
prvalue
s vs
xvalue
s没有任何关系。您的意思是即使o2(bar1)。value给出了正确的结果,这只是一个未定义行为的巧合?@true\u mogician是的,该行为不能保证。@true\u mogician BTW给出了
foo2(bar1)的分段错误。value