template <class T, class U> decltype(*(T*)(0) * *(U*)(0)) mul(T x, U y) {
return x * y;
}
Ten fragment kodu pochodzi z wersji C++11 FAQ firmy Stroustrup. Rozumiem, co robi, czyli mnożymy dwa obiekty różnych typów. Co mnie niepokoi, to składnia między parametrami szablonu a definicją funkcji. Co się dzieje wewnątrz decltype
? Rozumiem, że jest to odwołanie do nienazwanego wskaźnika T
inicjowanego na 0 i pomnożenie go przez nienazwany wskaźnik U
, który został dereferencjonowany i zainicjowany w ten sam sposób. Czy mam rację?Mylące składnie z anonimowymi typami szablonów?
Cóż, jeśli tak się dzieje, to czy stosowanie wskaźników, dereferencji i dodatkowego nawiasu nie jest zbyteczne? Nie udało się zainicjować typy tak utrzymując pożądany efekt ?:
template <class T, class U> decltype(T(0) * U(0)) mul(T x, U y) {
return x * y;
}
wygląda to znacznie czystsze do mnie, a to robi mieć taki sam skutek, gdy iloczyn dwóch liczb jak w pierwszym ...
mul(4, 3); // 12
Dlaczego więc Stroustrup kładzie nacisk na użycie złożonej składni wskaźnika, dereferencji i inicjalizacji? Jest to oczywiście przed wprowadzeniem nowej składni auto
. Ale w każdym razie, moje pytanie jest: Czy istnieje jakaś różnica między dwoma powyższymi formami inicjowania typu? Gdzie używa wskaźników i natychmiast je dereferencje zamiast po prostu robić to, co zrobiłem, co było do inicjowania typów bez wskaźników lub dereferencji? Każda reakcja jest doceniana.
Co stanie się, gdy otrzymamy 'T', który nie jest skonstruowany z' int'? –