这次谈话中的Scott在44:15表示,c++0x标准库中使用const Rvalue引用来捕获某些不应该编译的重载。
说明上述要点的代码片段将是有帮助的。谢谢。
发布于 2015-11-18 05:35:59
我发现一个有用的用法是禁用临时成员,等待引用成员。例如,考虑下面的代码:
struct Foo{};
class X
{
const Foo& _foo;
public:
X(const Foo&&) = delete; // prevents rvalue binding
X(const Foo& foo): _foo(foo){} // lvalue is OK
};
Foo get_Foo()
{
return {};
}
const Foo get_const_Foo()
{
return {};
}
Foo& get_lvalue_Foo()
{
static Foo foo;
return foo;
}
int main()
{
// X x1{get_Foo()}; // does not compile, use of deleted function
// X x2{get_const_Foo()}; // does not compile, use of deleted function
X x3{get_lvalue_Foo()}; // OK
}您肯定希望禁用传递给X构造函数的rvalue,因为rvalue不通过构造函数参数绑定到const引用,因此最终会有一个悬空引用。为什么是const Foo&&而不是简单的Foo&&?因为如果您使用X(Foo&&) = delete;,那么如果您的get_Foo()返回const Foo (这是个坏主意,但在实际代码中仍然可以看到),那么它将被绑定到X(const Foo&),最后会有一个悬空的引用。但是,上面代码中的X(const Foo&&)与const Foo rvalue匹配得更好,因此我们获得了无法用rvalue构造X的预期效果。
您还可能会问为什么不为lvalue构造函数定义X(Foo&)。那么,您将无法绑定const值。所以最好的方法是标记X(const Foo&&) = delete;。希望这能澄清这一点。
https://stackoverflow.com/questions/33515375
复制相似问题