0

私は次のようなログビルダータイプを持っています:

Log Log::log(const int logLevel) 
{ 
    return Log(logLevel); 
}

Log& operator <<(Log& log, const char * s)
{
    if (log.hasLogLevel())
        log.out << s;
    return log;
}

上記のコードを次のように使用しています。

Log::log(1) << "Hello logger";

しかし、私はこれらの警告を受けていますが、最近になって初めて、オペレーターが過負荷になっていることが原因であることに気付きました (または、少なくともこれは私が考えていることです)。

warning C4239: nonstandard extension used : 'argument' : conversion from 'snow::Log' to 'snow::Log &'

同じだからいいのかなrvalueこれらの演算子のオーバーロードを介して渡される/チェーンされています。このコードが MSVC++ 以外でコンパイルされるとは思わないので、ここで何をすべきかを知りたいです。

解決策が単に右辺値参照を使用することである場合、私はそれで大丈夫ですが、ここで何が起こっているのかをもう少しよく理解したいと思います.

4

1 に答える 1

4

問題、ログが右辺値であり、非 const 参照パラメーターへのバインドが許可されていないことです。Microsoft はこれを強制しません。壊れるレガシー コードがあるためです。

文字列のみを出力したい場合の回避策の 1 つoperator<<は、Log クラスのメンバーにすることです。 右辺値のメンバーを呼び出すことができます。

他の非メンバー演算子を使用する場合は、C++11 で標準ストリームが行うように、右辺値から左辺値へのコンバーターを提供できます。

何かのようなもの

template<class T>
Log& operator<<(Log&& log, const T& value)
{ return log << value; }

演算子の内部logは左辺値であり、他の演算子の非 const 参照にバインドできるという事実を使用します。

于 2012-10-26T11:43:47.483 に答える