【发布时间】:2014-10-19 00:20:17
【问题描述】:
关于右值的话题很多(参考)。
但我还没有找到以下问题的答案:
根据http://en.cppreference.com/w/cpp/utility/move,std::move() 将右值引用作为参数。
根据 C++11 标准 http://i.stack.imgur.com/YKlod.png 中的图表,左值不会是右值。
std::move()的常用用法:
Foo f;
std::deque<Foo> fq;
fq.push_back(std::move(f));
f 是左值,因为它是符合 C++11 标准的对象:
左值(所谓的,历史上,因为左值可能出现在赋值表达式的左侧)指定一个函数或一个对象。 [示例:如果 E 是指针类型的表达式,则 *E 是一个左值表达式,指的是 E 指向的对象或函数。再举一个例子,调用返回类型为左值引用的函数的结果是左值。]
然后,理论上,std::move(f) 应该给我一个编译错误,但它没有。我确定我错过了什么......
欢迎任何意见。
【问题讨论】:
-
实际上,用 std::move 大惊小怪是多余的。 std::vector 有 emplace_back 用于此目的
-
实际上,
std::move不采用右值引用,而是采用转发引用(又名通用引用),这意味着它可以是左值和右值引用。 -
@remyabel 什么是“折叠规则”?
-
@Deduplicator 所以 T&& 是转发参考/通用参考?那么,我们如何将右值引用指定为参数的一种类型呢?
-
@Hei 只是在推导
T的上下文中,如std::move-template的原型。在这种情况下,如果您真的想限制为右值引用,请使用 SFINAE 或static_assert和类型特征。
标签: c++11