std :: result_of не работает с функтором, у которого operator () имеет аргумент rvalue в Visual Studio 2012

Вот простой пример:

#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 реализации? (Я написал это как обходной путь).

2

Решение

Я думаю, что это ошибка в реализации std::result_of или же std::declval<>(),

В пункте 20.9.7.6 (таблица 57) Стандарта C ++ 11 указано, что для result_of:

Если выражение
INVOKE(declval<Fn>(),
declval<ArgTypes>()...)
хорошо
образуется, когда рассматривается как
неоцененный операнд (пункт 5),
член typedef type должен назвать
тип
decltype(INVOKE(declval<Fn>(),
declval<ArgTypes>()...));

в противном случае не должно быть члена
тип.

В этом случае, INVOKE(declval<A&>(), declval<int>()) разрешает вызывать lvalue типа A со значением типа int (см. пункт 20.8.2 / 1).

Учитывая оператор вызова Aчлен typedef type должен решить int,

1

Другие решения

Наследование функтора от std :: unary_function, кажется, решает эту ошибку VS2012

1

По вопросам рекламы [email protected]