次の関数について考えてみます。
template <typename A, typename B>
auto Min(A&& a, B&& b)
-> decltype(a < b ? std::forward<A>(a) : std::forward<B>(b))
{
return a < b ? std::forward<A>(a) : std::forward<B>(b);
}
フラグメントMin(0, 1)
により、テンプレートはとしてインスタンス化されMin<int, int>
ます。不思議なことに、Min
私のコードのwith g ++とclangのマングル名は_Z3MinIiiEDTqultfp_fp0_cl7forwardIT_Efp_Ecl7forwardIT0_Efp0_EEOS0_OS1_
(別名:)ですdecltype (({parm#1}<{parm#2})?((forward<int>)({parm#1})) : ((forward<int>)({parm#2}))) Min<int, int>(int&&, int&&)
。つまり、戻り型を推測するために使用される式は、マングルされた名前の一部です。_Z3MinIiiET_OS0_OT0_
個人的に、私は:(別名:)の線に沿ってもう少し正気な何かを期待していましたint Min<int, int>(int&&, int&&)
。なぜそうではないのですか?
decltype
g ++は、これらの形式が両方ともあるため、実際に必要な場合にのみ式を配置するよう_Z3Maxii
です。
auto Max(int x, int y) -> int
auto Max(int x, int y) -> decltype(0)