【发布时间】:2020-05-20 12:14:44
【问题描述】:
根据cppreference,在return语句中,本地右值引用应该从C++20中移出:
从局部变量和参数自动移动
如果表达式是一个(可能带括号的)id 表达式,它命名一个变量,其类型为
非易失性对象类型或 对对象类型的非易失性右值引用 (C++20 起)
我尝试了第二个要点(godbolt):
#include <cstdio>
struct Foo {};
struct Bar {
Bar() = default;
Bar(const Foo &) {
printf("copy!\n");
}
Bar(Foo &&) {
printf("move!\n");
}
};
Bar foo() {
Foo f;
Foo &&rf = static_cast<Foo &&>(f);
return rf;
}
int main() {
foo();
}
我预计这个程序会打印move!。但实际上,clang 和 gcc 都打印 copy!。这是尚未在编译器中实现的东西吗?还是我误会了什么?
【问题讨论】:
-
这个例子中有两个类的目的是什么?
-
@DanielLangr:不能避免 NRVO。
-
检查 here,自 19.24 版本起仅在 MSVC 上可用 - DR:隐式移动更多本地对象和右值引用。
-
@rafix07 这基本上是一个答案。
-
@rafix07:谢谢,很高兴知道那张桌子!