gpt4 book ai didi

C++ 赋值给隐式转换的左值

转载 作者:IT老高 更新时间:2023-10-28 22:59:55 26 4
gpt4 key购买 nike

考虑一下这段 C++ 代码:

struct Foo {
float value;

operator float& () {
return this->value;
}
};

int main() {
Foo foo;
foo=1.0f; //Doesn't compile, foo isn't implicitly converted to a float&

return 0;
}

为什么不编译?是否有特定原因未包含在 C++ 标准中?还是确实存在等价物,而我只是用错了?

最佳答案

对于几乎所有其他运算符,您的转换运算符会完全按照您的意愿行事,即使您添加自定义运算符,它也会继续按照您的意愿行事。

struct Foo {
float value;
operator float& () { return this->value; }
Foo &operator+=(Foo);
};
int main() {
Foo foo {};
foo+=1.0; // compiles and works
// equivalent to foo.operator float&()+=1.0;
}

但是,= 比较特殊,= 的规则与大多数其他运算符不同。由 T.C. 确定:

13.3.1.2 Operators in expressions [over.match.oper]

4 For the built-in assignment operators, conversions of the left operand are restricted as follows:
(4.1) -- no temporaries are introduced to hold the left operand, and
(4.2) -- no user-defined conversions are applied to the left operand to achieve a type match with the left-most parameter of a built-in candidate.

再加上不允许将任何自定义 operator= 定义为全局函数,这确保 foo=bar; where foo 是一个类类型,总是意味着 foo.operator=(bar);,仅此而已。

这个操作符被挑出来的事实并不能解释原因,但确实很清楚这是一个有意的决定,并确保 foo=bar; 总是意味着 foo.operator=(bar);,没有别的,就其本身而言似乎是一个正当的理由。

关于C++ 赋值给隐式转换的左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39936865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com