template <class T, class U> decltype(*(T*)(0) * *(U*)(0)) mul(T x, U y) {
return x * y;
}
このコードは、Stroustrup のC++11 FAQから取られたものです。さまざまなタイプの 2 つのオブジェクトを乗算することを理解しています。私を困惑させているのは、テンプレート パラメーターと関数定義の間の構文です。内部で何が起こっているのdecltype
ですか?0 に初期化された名前のないポインターを逆参照し、同じ方法で逆参照および初期化さT
れる名前のないポインターを掛けていると思います。U
私は正しいですか?
もしこれが起こっているのなら、ポインター、逆参照、および余分な括弧の使用は不必要ではないでしょうか? 目的の効果を維持しながら、このように型を初期化できませんでしたか?:
template <class T, class U> decltype(T(0) * U(0)) mul(T x, U y) {
return x * y;
}
これは私にはずっときれいに見え、最初のように2つの数値を掛けるときと同じ効果があります...
mul(4, 3); // 12
では、Stroustrup が複雑なポインター、逆参照、および初期化構文の使用に固執するのはなぜでしょうか? もちろん、これは彼が新しいauto
構文を導入する前のことです。とにかく、私の質問は次のとおりです。型の初期化の上記の 2 つの形式に違いはありますか? 彼がポインターを使用して、私がしたことを単純に行うのではなく、即座にそれらを逆参照するのは、ポインターや逆参照なしで型を初期化することでしたか? 任意の応答をいただければ幸いです。