我在副标题“解决方案”下从这里获得了下面的示例。
std::accumulate(a, a + 10, 0);
对我来说,调用中第二个参数的评估main()
必须在std::accumulate()
函数调用之前。也就是说,必须在 function 之前调用operator+(N::C, int)
in 命名空间。但是不仅没有定义这个操作符,代码也正常编译执行。这里发生了什么事?N
std::accumulate()
namespace N
{
class C {};
int operator+(int i, N::C) { return i+1; }
}
#include <numeric>
int main()
{
N::C a[10];
std::accumulate(a, a + 10, 0);
}
而是调用此模板函数
template<class _InIt,
class _Ty> inline
_Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val)
{ // return sum of _Val and all in [_First, _Last)
_DEBUG_RANGE(_First, _Last);
return (_Accumulate(_Unchecked(_First), _Unchecked(_Last), _Val));
}
哪里_InIt = N::C
和_Ty = int
。我对模板不太了解,但是编译器如何推断出它a + 10
也是一个N::C
?