Вот простой пример:
#include <type_traits>
int foo() {
return 2;
}
struct A {
int operator()(int&& x) {
return x*2;
}
};
int main(int, char**) {
std::result_of<A&(int)>::type x = 42;
return 0;
}
Когда я пытаюсь скомпилировать его в VisualStudio 2012, я получаю сообщение об ошибке:
error C2664: 'int A::operator ()(int &&)' : cannot convert parameter 1 from 'int' to 'int &&'
You cannot bind an lvalue to an rvalue reference
Я компилирую тот же код в mingw-g ++ и все работает нормально.
Могу ли я сделать что-нибудь, вместо того, чтобы написать свой собственный result_of реализации? (Я написал это как обходной путь).
Я думаю, что это ошибка в реализации std::result_of
или же std::declval<>()
,
В пункте 20.9.7.6 (таблица 57) Стандарта C ++ 11 указано, что для result_of
:
Если выражение
INVOKE(declval<Fn>(),
хорошо
declval<ArgTypes>()...)
образуется, когда рассматривается как
неоцененный операнд (пункт 5),
член typedeftype
должен назвать
тип
decltype(INVOKE(declval<Fn>(),
declval<ArgTypes>()...));
в противном случае не должно быть члена
тип.
В этом случае, INVOKE(declval<A&>(), declval<int>())
разрешает вызывать lvalue типа A
со значением типа int
(см. пункт 20.8.2 / 1).
Учитывая оператор вызова A
член typedef type
должен решить int
,
Наследование функтора от std :: unary_function, кажется, решает эту ошибку VS2012