首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获不应该编译的重载的Const引用

捕获不应该编译的重载的Const引用
EN

Stack Overflow用户
提问于 2015-11-04 06:48:37
回答 1查看 47关注 0票数 3

这次谈话中的Scott在44:15表示,c++0x标准库中使用const Rvalue引用来捕获某些不应该编译的重载。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-18 05:35:59

我发现一个有用的用法是禁用临时成员,等待引用成员。例如,考虑下面的代码:

代码语言:javascript
运行
复制
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;。希望这能澄清这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33515375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档