以下 C++11 代码无法编译:
struct T {};
void f(T&&) { }
void g(T&& t) { f(t); }
int main()
{
g(T());
}
正确的做法是:
void g(T&& t) { f(move(t)); }
这很难用正确的自然语言术语来解释。参数 t
似乎失去了它需要用 std::move
恢复的“&&”状态。
g(T())
中的 T()
是什么意思?
g(T&& t)
中的T&&
是什么意思?
g(T&& t)
中的 t
是什么意思?
f(t)
和 f(move(t))
中的 t
是什么?
move(t)
的返回值是什么?
你怎么称呼整体效果?
标准的哪些部分涉及此问题?
最佳答案
关键是参数T&& b
只能绑定(bind)到一个右值,但是当后面引用表达式b
时是一个左值。
所以函数的参数必须是一个右值,但在函数体内参数是一个左值,因为到那时你已经绑定(bind)了一个对它的引用并给它一个名字,它不再是一个未命名的临时值。
表达式有一个类型(例如int
、string
等)并且它有一个值类别 (例如左值或右值)这两个东西是不同的。
声明为 T&& b
的命名变量具有类型“对 T
的右值引用”并且只能绑定(bind)到右值,但是当您稍后使用该引用时表达式 b
具有值类别“lvalue”,因为它有一个名称并引用某个对象(无论引用绑定(bind)到什么,即使它是一个右值。)这意味着传递 b
到另一个接受右值的函数你不能只说 f(b)
因为 b
是一个左值,所以你必须转换它(返回)到右值,通过 std::move(b)
。
关于C++11 `T&&` 参数丢失其 `&&` 正确术语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185142/