以下の例は、サブタイトル「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
か?