チェーンをサポートするためにconst参照をoperator=返す必要があることはよく知られていますが、これは右辺値が値のようなものとして使用できる場合にのみ機能します。*this*this
編集:問題ありません。constoperator=以外の参照を返す必要があります(ints として実行します)。これは、割り当て*thisで意味のあるものにする必要があることを意味しました。rhs
オーバーロードされた一時的な書き込み専用を返すことで、C++ クラスApiWrapperを介して name=value セッター関数の C API をラップしていますが、API にはゲッター関数がないため、実質的に書き込み専用です。operator[]Proxyoperator=Proxy
ApiWrapper x;
x["a"] = x["b"] = 42; // x["b"] = 42; fine: consumes 42, returns *this
// x["a"] = x["b"]; error: x["b"] does not have the value
fromrhsの代わりにconst 参照を返すと、連鎖がうまくいくように思えます。概念的に (プロキシ ボイラープレート コードは省略):*thisoperator=
struct Proxy {
template <typename T>
T const& operator=(T const& rhs) const
{
... // pass rhs to the API but don't store it
return rhs; // return rhs, not *this
}
};
ApiWrapper x;
x["a"] = x["b"] = 42; // x["b"] = 42; fine: consumes and returns 42
// x["a"] = 42; fine: consumes and returns 42
しかし、これは私を疑わしくさせます。rhsの代わりにconst 参照を返すことによる奇妙な副作用はあり*thisますか? 私が考えられる唯一のことは、次のような式では使用できないということです(x["a"] = 42).doSomething()がProxy、書き込み専用であるため、とにかくそのようなものはサポートできません。それとも、チェーンを許可しない方がよいでしょうか (たとえば、 を返すことによってvoid)?
編集:値のようなものではない場合でも、Proxy代入をサポートすることは理にかなっていると思います。次のような構文糖衣を許可します。
// this: // rather than:
ApiWrapper w; API * ptr = make_api_instance();
w["name"] = "Batman"; api_set_str(ptr, "name", "Batman");
w["age"] = 42; api_set_int(ptr, "age", 42);
w["pi"] = 3.14; api_set_double(ptr, "pi", 3.14);