1

我在副标题“解决方案”下从这里获得了下面的示例。

std::accumulate(a, a + 10, 0);对我来说,调用中第二个参数的评估main()必须在std::accumulate()函数调用之前。也就是说,必须在 function 之前调用operator+(N::C, int)in 命名空间。但是不仅没有定义这个操作符,代码也正常编译执行。这里发生了什么事?Nstd::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?

4

1 回答 1

6

a + 10不调用您班级的任何操作员。它只是添加10a,它是一个数组,在此上下文中衰减为指向其第一个元素的指针。您的代码相当于:

std::accumulate(&a[0], &a[10], 0);

根本不对+您的对象进行操作。

于 2013-07-07T18:04:18.087 回答