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& ;. 但如果我用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' } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |