问题与std :: reference_wrapper [英] Issue with std::reference_wrapper
问题描述
使用以下代码清楚地显示问题:
The issue is clear with the following code:
#include <functional>
#include <iostream>
#include <vector>
int main() {
//std::vector<int> a, b;
int a = 0, b = 0;
auto refa = std::ref(a);
auto refb = std::ref(b);
std::cout << (refa < refb) << '\n';
return 0;
}
如果我使用注释的 std :: vector< int> a,b;
而不是 int a = 0,b = 0;
,那么代码不能在GCC 5.1,clang 3.6 ,或MSVC'13。在我看来, std :: reference_wrapper< std :: vector< int>>
可隐式转换为 std :: vector< int&
这是LessThanComparable,因此它应该是LessThanComparable本身。
If I use the commented std::vector<int> a, b;
instead of int a = 0, b = 0;
, then the code does not compile on any of GCC 5.1, clang 3.6, or MSVC'13. In my opinion, std::reference_wrapper<std::vector<int>>
is implicitly convertible to std::vector<int>&
which is LessThanComparable, and thus it should be LessThanComparable itself. Could someone explain this to me?
推荐答案
问题是非成员 operator
std :: vector
是一个函数模板:
The issue is that the non-member operator<
for std::vector
is a function template:
template< class T, class Alloc >
bool operator<( const vector<T,Alloc>& lhs,
const vector<T,Alloc>& rhs );
在执行模板类型扣除时,隐式转换不 .arg.explicit]强调if:
Implicit conversions are not considered when doing template type deduction here, [temp.arg.explicit] emphasis on if:
隐式转换(第4条)将对函数参数执行,以将其转换为类型
对应的函数参数 if ,参数类型不包含参与模板参数扣除的
的模板参数。
Implicit conversions (Clause 4) will be performed on a function argument to convert it to the type of the corresponding function parameter if the parameter type contains no template-parameters that participate in template argument deduction.
但在这种情况下,参数类型确实参与了扣除。这就是为什么它不能找到。如果我们写我们自己的非 -template 运算符
But in this case, the parameter type does participate in deduction. That's why it can't be found. Had we written our own non-template operator<
:
bool operator<(const std::vector<int>& lhs, const std::vector<int>& rhs)
{
return true;
}
您的代码将按预期工作。要使用通用的,你必须明确地拉出引用:
Your code would work as expected. To use the generic one though, you will have to explicitly pull out the reference:
std::cout << (refa.get() < refb.get()) << '\n';
这篇关于问题与std :: reference_wrapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!