Подтвердить что ты не робот

Вычисление типа функции шаблона и оператор << С++

Когда я компилирую следующий код с 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) ]
4b9b3361

Ответ 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;
}