Учитывая следующие объявления:
struct MyClass { };
typedef int MyClass::*Mp;
В обоих компиляторах gcc 6.2 и Clang я попытался, result_of<Mp(const MyClass)>::type
дает int&&
.
Резюме моего вопроса: Почему int&&
, а не const int&&
или просто int
?
Больше фона: в стандарте указано, что result_of
определяется следующим образом:
тип typedef-члена должен указывать тип
decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));
Стандарт также определяет INVOKE для объектов-указателей-членов:
- t1. * f, когда N == 1 и f - указатель на элемент данных класса T и
is_base_of_v<T, decay_t<decltype(t1)>>
- true;
Обратите внимание, что decay_t
предназначен только для проверки того, применяется ли эта марка. Насколько я могу судить, применение двух вышеперечисленных пунктов должно дать:
decltype(declval<const MyClass>().*declval<Mp>())
Что дает const int&&
. Итак, я что-то упустил или неправильно компилирует библиотеки компилятора?
Изменить, 30 августа 2016 года:
Спасибо за ответы. Несколько человек предложили альтернативные способы получения правильного результата без использования result_of
. Я должен пояснить, что причина, по которой я повесил правильное определение result_of
, заключается в том, что я фактически реализую ближайшую разумную реализацию result_of
, которая работает с компилятором pre-С++ 11. Поэтому, хотя я согласен с тем, что я могу использовать decltype
или result_of<Mp(const MyClass&&)>::type
в С++ 11, они не делают то, что мне нужно для С++ 03. Несколько человек дали правильный ответ, который заключается в том, что аргументы const rvalue для функций не являются частью типа функции. Это проясняет мне все, и я реализую свой pre-С++ 11 result_of
, чтобы он также отбрасывал эти квалификаторы.