Учитывая следующие объявления:
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, чтобы он также отбрасывал эти квалификаторы.