c++ - Const Rvalue 引用以捕获不应编译的重载

标签 c++ stl rvalue-reference overloading

Scott Meyers 在 this talk在 44:15,说 const 右值引用在 c++0x 标准库中用于捕获某些不应编译的重载。

说明上述要点的代码片段会有所帮助。谢谢。

最佳答案

我发现有用的一种用法是禁用临时投标引用成员。例如,考虑以下代码:

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 的构造函数,因为右值不会通过构造函数参数绑定(bind)到 const 引用,所以您最终会得到一个悬挂引用。为什么是 const Foo&& 而不是简单的 Foo&&?因为如果您使用 X(Foo&&) = delete;,那么如果您的 get_Foo() 返回 const Foo(这是个坏主意,但是然而在实际代码中可以看到),它将绑定(bind)到 X(const Foo&) 而不是,你最终会得到一个悬空引用。但是,上面代码中的 X(const Foo&&) 更适合 const Foo 右值,因此我们获得了无法构造 X 具有右值。

您可能还会问为什么不为左值构造函数定义 X(Foo&)。那么你将无法绑定(bind) const 左值。所以最好的办法是标记X(const Foo&&) = delete;。希望这可以澄清。

关于c++ - Const Rvalue 引用以捕获不应编译的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33515375/

相关文章:

c++ - std::condition_variable 伪阻塞

c++ - 设置 union 不起作用

c++ - 如何将 opengl 形状堆叠到 std::vector 中

STL 容器中的 C++11 shared_pointer constness

c++ - 如何使用在函数中本地创建的对象而不将其复制到内存中?

c++ - 我的第一个 CPP 程序的问题 - 标题和源代码

python - Boost.Python 从类型创建句柄

C++ 库中的 C# 枚举

c++ - 为什么右值引用可以绑定(bind)到函数?

c++ - 为什么使用 std::forward<T> 而不是 static_cast<T&&>