otrzymuje następujące deklaracje:result_of dla obiektu zarejestrował się z CV kwalifikacje argumentem
struct MyClass { };
typedef int MyClass::*Mp;
Zarówno gcc 6.2 i brzękiem kompilatora próbowałem, result_of<Mp(const MyClass)>::type
daje int&&
.
Podsumowanie moje pytanie: Dlaczego int&&
i nie bądź const int&&
lub po prostu int
?
Więcej Tło: Norma mówi, że result_of
jest zdefiniowana w ten sposób:
członek typu typedef wyznacza typ
decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));
Norma określa również powołać się na wskaźnik do członka -obiekty w ten sposób:
- t1. * f gdy N == 1, a f jest wskaźnikiem do elementu danych klasy T i
is_base_of_v<T, decay_t<decltype(t1)>>
jest prawdziwe;
Należy pamiętać, że decay_t
służy wyłącznie do sprawdzania, czy dotyczy to tego wypunktowania. O ile mogę powiedzieć, stosując dwa punkty powyżej powinna przynieść:
decltype(declval<const MyClass>().*declval<Mp>())
co daje const int&&
. Tak, brakuje mi czegoś lub są błędne biblioteki kompilatora?
Edit, 30 sierpnia 2016:
Dzięki za odpowiedzi. Kilka osób zaproponowało alternatywne sposoby uzyskania poprawnego wyniku bez używania result_of
. Powinienem wyjaśnić, że powód dla którego jestem powiesił się na poprawnej definicji result_of
jest to, że faktycznie wdrażam najbliższą rozsądną implementację result_of
, która działa z kompilatorem przed C++ 11. Tak więc, podczas gdy zgadzam się, że mogę używać decltype
lub result_of<Mp(const MyClass&&)>::type
w C++ 11, nie robią tego, czego potrzebuję dla C++ 03. Kilka osób udzieliło poprawnej odpowiedzi, co oznacza, że argumenty rvalue const dla funkcji nie są częścią typu funkcji. To wyjaśnia rzeczy dla mnie i będę implementował moje pre-C++ 11 result_of
takie, że odrzuca te kwalifikatory.
Um, myślę, że masz literówkę w deklaracji funkcji członka? Czy może czegoś brakuje? – Yakk
Ithth__ czytam w książce _Stroustrup_, że 'const int &&' nie ma sensu (jako że cała idea wartości r jest taka, że _ może być przenoszona, a 'const' blokuje to), więc' const' jest automatycznie usuwana. – Aganju
@Yakk, nie ma deklaracji funkcji członka. Jest to deklaracja typu wskaźnik do elementu (dane), która jest używana. @Aganju, Stroustrup ma rację, że 'const int &&' ma ograniczoną użyteczność ALE to robi * ma sens *, jest zdefiniowane w języku i jest obsługiwane przez kompilatory. W rzeczywistości jego wygląd jest artefaktem konstruktów takich jak ten i nie widzę niczego w specyfikacji, które mogłoby temu zapobiec. (Jestem członkiem komitetu standardowego C++, więc mogę zadać to samo pytanie na standardowej liście e-mailowej.) –