Вывод типа шаблонной функции и оператор & lt; & lt;

Когда я компилирую следующий код с MSVC ++, Я получаю ошибку:

struct A
{
template<typename T>
void operator<<(T&& x)
{
}

};
void f()
{
}
int main()
{
A().operator<<( f );  // ok
A() << f;             // error

return 0;
}

г ++ а также лязг оба компилируют этот код нормально.
НАСКОЛЬКО МНЕ ИЗВЕСТНО, ‘Хорошо‘ а также ‘ошибкастроки делают то же самое, и введите T выводится недействительным (&) (). Либо это недействительными () а rvalue ссылки на функцию разрешены? Если так, то в чем их смысл?
Это нормально для передачи функций по ссылке, как это? Это MSVC ++ ошибка в том, что он не компилируетсяошибка‘ линия? Кстати, ошибка вывода:

no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion)
could be 'void A::operator <<<void(void)>(T (__cdecl &&))'
with[ T=void (void) ]

14

Решение

Зачем void operator<<(T&& x)? void operator<<(T& x) служит цели.

Функция может быть вызвана с x() внутри перегруженной функции, как показано ниже

struct A
{
template<typename T>
void operator<<(T& x)
{
x();
}

};
void f()
{
}

int main()
{
A().operator<<( f );
A() << f;
return 0;
}
4

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

Итак, отвечая на мой собственный вопрос:

Предоставленный код действителен, и, хотя rvalue-ссылки на функции разрешены (они действуют идентично lvalue-ссылкам), здесь во время вывода шаблона T должно стать void (&) ().

ошибка в MSVC предотвращает компиляцию моего кода.

ОБНОВИТЬ: Ошибка была исправлена ​​в компиляторе Visual Studio 2013

3

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