14

次のコードをMSVC++でコンパイルすると、エラーが発生します。

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」および「error」行はまったく同じことを行い、型Tはvoid(&)()に推定されます。それともvoid()であり、関数への右辺値参照は許可されていますか? もしそうなら、それらの意味は何ですか?そのように関数を参照渡ししても問題ありませんか? 「 error」行でコンパイルに失敗するのは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) ]
4

2 に答える 2

4

なぜ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;
}
于 2013-02-18T19:50:10.837 に答える
3

だから、私自身の質問に答える:

提供されたコードは有効であり、関数への右辺値参照は許可されていますが (左辺値参照と同じように動作します)、ここでテンプレート推論中に T は void(&)() になる必要があります。

MSVCのバグにより、コードをコンパイルできません。

更新: Visual Studio 2013 コンパイラでバグが修正されました

于 2013-02-21T17:44:29.357 に答える