加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 从rvalue参数中推导出对const的引用

发布时间:2020-12-16 05:43:42 所属栏目:百科 来源:网络整理
导读:好的,这可能是一个愚蠢的问题,但是在这里呢? template typename Tvoid foo(T x){}int main(){ foo(42); // error in passing argument 1 of 'void foo(T) [with T = int]'} 使用T = const int来阻止C实例化foo函数模板是什么? 解决方法 问题是,模板类型扣
好的,这可能是一个愚蠢的问题,但是在这里呢?
template <typename T>
void foo(T& x)
{
}

int main()
{
    foo(42);
    // error in passing argument 1 of 'void foo(T&) [with T = int]'
}

使用T = const int来阻止C实例化foo函数模板是什么?

解决方法

问题是,模板类型扣除必须确定完全匹配,而在特定情况下,由于签名中的引用,完全匹配需要左值.值42不是一个左值,而是一个右值,并且用const int解析T将不会产生完美匹配.由于模板类型扣除仅限于精确匹配,因此不允许扣除.

如果不使用字面值,则使用非可变的左值,那么编译器将会自然地推导出类型,因为const int将成为参数的完美匹配:

const int k = 10;
foo( k );            // foo<const int>( const int & ) is a perfect match

现在有一个特殊的规则,可以调用一个使用一个带有rvalue的const引用(nonmutable lvalue)的函数,这意味着创建一个稍后绑定到引用的临时lvalue,但是对于这个规则来说,在手之前有这个签名,这就是为什么明确说明模板的类型是const int的工作原理:foo< const int>(42).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读