草庐IT

c++ - 理解右值引用

我认为我对右值引用不太了解。为什么以下无法编译(VS2012)并出现错误'foo':cannotconvertparameter1from'int'to'int&&'?voidfoo(int&&){}voidbar(int&&x){foo(x);};我会假设int&&类型在从bar传递到foo时会被保留。为什么一旦进入函数体就变成int?我知道答案是使用std::forward:voidbar(int&&x){foo(std::forward(x));}所以也许我只是不明白为什么。(另外,为什么不std::move?) 最佳答案 我

c++ - 理解右值引用

我认为我对右值引用不太了解。为什么以下无法编译(VS2012)并出现错误'foo':cannotconvertparameter1from'int'to'int&&'?voidfoo(int&&){}voidbar(int&&x){foo(x);};我会假设int&&类型在从bar传递到foo时会被保留。为什么一旦进入函数体就变成int?我知道答案是使用std::forward:voidbar(int&&x){foo(std::forward(x));}所以也许我只是不明白为什么。(另外,为什么不std::move?) 最佳答案 我

c++ - 为什么 const 引用会延长右值的生命周期?

为什么C++委员会决定const引用应该延长临时对象的生命周期?这个事实已经在网上进行了广泛的讨论,包括在stackoverflow上。解释这种情况的权威资源可能是这个GoTW:GotW#88:ACandidateForthe“MostImportantconst”此语言功能的基本原理是什么?知道吗?(替代方案是临时对象的生命周期不会被任何引用延长。)我自己的基本理论是,这种行为允许对象隐藏实现细节。使用此规则,成员函数可以在返回值或对内部已经存在的值的const引用之间切换,而无需对客户端代码进行任何更改。例如,矩阵类可能能够返回行vector和列vector。为了最小化拷贝,可以根

c++ - 为什么 const 引用会延长右值的生命周期?

为什么C++委员会决定const引用应该延长临时对象的生命周期?这个事实已经在网上进行了广泛的讨论,包括在stackoverflow上。解释这种情况的权威资源可能是这个GoTW:GotW#88:ACandidateForthe“MostImportantconst”此语言功能的基本原理是什么?知道吗?(替代方案是临时对象的生命周期不会被任何引用延长。)我自己的基本理论是,这种行为允许对象隐藏实现细节。使用此规则,成员函数可以在返回值或对内部已经存在的值的const引用之间切换,而无需对客户端代码进行任何更改。例如,矩阵类可能能够返回行vector和列vector。为了最小化拷贝,可以根

c++ - 普通的右值引用和 std::forward 返回的有什么区别?

我做不到:int&&q=7;int&&r=q;//ErrorMessage://cannotconvertfrom'int'to'int&&'//Youcannotbindanlvaluetoanrvaluereference如果我理解正确,在初始化右值引用时,也会初始化一个临时变量。所以int&&q=7;可以认为是:inttemp=7;int&&q=temp;当在右侧使用引用时,我实际上是在使用裁判。所以int&&r=q;可以认为是:int&&r=temp;//bindanlvaluetoanrvaluereference,causeerror,understandable以上是我对

c++ - 普通的右值引用和 std::forward 返回的有什么区别?

我做不到:int&&q=7;int&&r=q;//ErrorMessage://cannotconvertfrom'int'to'int&&'//Youcannotbindanlvaluetoanrvaluereference如果我理解正确,在初始化右值引用时,也会初始化一个临时变量。所以int&&q=7;可以认为是:inttemp=7;int&&q=temp;当在右侧使用引用时,我实际上是在使用裁判。所以int&&r=q;可以认为是:int&&r=temp;//bindanlvaluetoanrvaluereference,causeerror,understandable以上是我对

c++ - 隐式将返回的左值视为右值

12.8复制和move类对象[class.copy]§31和§32说:inareturnstatementinafunctionwithaclassreturntype,whentheexpressionisthenameofanon-volatileautomaticobject(otherthanafunctionorcatch-clauseparameter)withthesamecv-unqualifiedtypeasthefunctionreturntype,thecopy/moveoperationcanbeomittedbyconstructingtheautomatic

c++ - 隐式将返回的左值视为右值

12.8复制和move类对象[class.copy]§31和§32说:inareturnstatementinafunctionwithaclassreturntype,whentheexpressionisthenameofanon-volatileautomaticobject(otherthanafunctionorcatch-clauseparameter)withthesamecv-unqualifiedtypeasthefunctionreturntype,thecopy/moveoperationcanbeomittedbyconstructingtheautomatic

c++ - 为什么这个右值引用绑定(bind)到左值?

我不明白为什么以下代码在GCC8.0上编译:decltype(auto)foo(int&&r){returnr;}在foo中,r的声明类型为int&&,所以foo的返回类型为还有int&&。但是r本身就是一个左值,左值不能绑定(bind)到右值引用。我错过了什么吗? 最佳答案 根据[dcl.spec.auto]/5,则推导出返回类型,就好像return语句的操作数是decltype的操作数一样。和[dcl.type.simple]/(4.2)明确指出,由于操作数没有括号,实体的类型是decltype产生的类型,即int&&。事实上,

c++ - 为什么这个右值引用绑定(bind)到左值?

我不明白为什么以下代码在GCC8.0上编译:decltype(auto)foo(int&&r){returnr;}在foo中,r的声明类型为int&&,所以foo的返回类型为还有int&&。但是r本身就是一个左值,左值不能绑定(bind)到右值引用。我错过了什么吗? 最佳答案 根据[dcl.spec.auto]/5,则推导出返回类型,就好像return语句的操作数是decltype的操作数一样。和[dcl.type.simple]/(4.2)明确指出,由于操作数没有括号,实体的类型是decltype产生的类型,即int&&。事实上,