1

以下の例は、サブタイトル「The Solution」の下にあるhereから取得しました。

私にとって、呼び出しの 2 番目の引数の評価は、関数呼び出しstd::accumulate(a, a + 10, 0);main()先行する必要があります。std::accumulate()つまり、関数の前に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か?

4

1 に答える 1

6

a + 10クラスの演算子を呼び出しません。に追加10するだけaで、これは配列であるため、このコンテキストの最初の要素へのポインターに減衰します。あなたのコードは以下と同等です:

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

いいえ+、オブジェクトをまったく操作しません。

于 2013-07-07T18:04:18.087 に答える