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

c – 什么时候std :: reference_wrapper转换为T&?

发布时间:2020-12-16 05:02:27 所属栏目:百科 来源:网络整理
导读:请考虑以下代码: #include iostream#include functionalusing namespace std;templateclass Tvoid fun(T t) { t+=8;}int main(){ int i = 0; fun(ref(i)); cout i endl;} 此代码打
请考虑以下代码:
#include <iostream>
#include <functional>

using namespace std;

template<class T>
void fun(T t) 
{ 
    t+=8;
}


int main()
{
    int i = 0;
    fun(ref(i));
    cout << i << endl;
}

此代码打印“8”.我假设fun()中的t自动转换为int&amp ;.

但如果我用t = 8替换t = 8,程序将无法编译.

为什么?

解决方法

的reference_wrapper< T>有一个T&隐式转换运算符,所以它将被转换为T& T& T是比reference_wrapper< T>更好的匹配.

在扩充赋值表达式中,唯一可行的运算符是int& operator =(int&,int),因此int&提取.

在赋值表达式中,成员运算符reference_wrapper< int> :: operator =(const reference_wrapper< int>&)也可用,因此成员运算符是首选;然后编译器尝试从常量8构造一个引用包装器,它会失败.赋值运算符具有重新绑定的效果,这对于像tie这样的工具按预期工作是必需的.

这意味着引用包装器更接近Python等语言中的引用而不是C引用:

#include <functional>
#include <iostream>

int main() {
    int i = 1,j = 2;
    std::ref(i) = j;
    std::cout << i << 'n';                 // prints '1'
}

(编辑:李大同)

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

    推荐文章
      热点阅读