众所周知,operator=
应该返回一个const引用来*this
支持链接,但这只有在*this
可以用作类似值的右值时才有效。
编辑:很好,operator=
应该返回一个非常量引用(作为int
s 执行),我的意思是这*this
需要rhs
在分配中有意义。
我正在通过 C++ 类包装 name=value setter 函数的 C API,ApiWrapper
并返回一个带重载operator[]
的临时只写函数,但该 API 没有 getter 函数,因此实际上是只写函数。Proxy
operator=
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
在我看来,如果我返回一个 const 引用rhs
而不是*this
from operator=
,则链接可以正常工作。从概念上讲(省略了代理样板代码):
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);