Вычисление типа функции шаблона и оператор << С++
Когда я компилирую следующий код с MSVС++, я получаю сообщение об ошибке:
struct A
{
template<typename T>
void operator<<(T&& x)
{
}
};
void f()
{
}
int main()
{
A().operator<<( f ); // ok
A() << f; // error
return 0;
}
g++ и clang оба компилируют этот код в порядке.
AFAIK, ' ok и < ошибка "делают то же самое, и тип T выводится void (& )(). Или это void() и допустимы ссылки на функцию? Если да, то в чем их смысл?
Можно ли передавать функции по ссылке? Является ли это MSVС++ ошибкой, что она не скомпилирует строку ошибка "? BTW, выход ошибки:
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) ]
Ответы
Ответ 1
Итак, отвечая на мой собственный вопрос:
Приведенный код действителен и в то время как rvalue ссылки на функции разрешены (они действуют одинаково с ссылками на lvalue), здесь во время вычитания шаблона T становится недействительным (&)().
A ошибка в MSVC запрещает компиляцию моего кода.
UPDATE: ошибка была исправлена в компиляторе Visual Studio 2013
Ответ 2
Почему 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;
}