gpt4 book ai didi

c++ - 二元运算符 + , = 用 const 重载

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:50 25 4
gpt4 key购买 nike

我正在学习 C++ 概念,非常感谢任何解释方面的帮助。为什么语句 4 未编译但语句 1 编译。

class X {
public:
X& operator= (const X& rhs);
const X& operator+ (const X& rhs) const;
const X& operator+ (int m);
private:
int n;
};

int main() {
X a, b, c;
a = a + 5 + c; //statement 1 - No compiler errors
a = b + 5; //statement 2
a = a = b + c; //statement 3
a = b + c + 5; //statement 4 /*compiler Error thrown -
passing 'const X' as 'this' argument of 'const X& X::operator+(int)' discards qualifiers
[-fpermissive]*/
(c = a + a) = b + c; //statement 5
}

根据我的理解(基于:+ 和 = 都是右结合的)以上 5 个语句被解读为-

//statement 1
a.operator=(a.operator+(5.operator+(c)));

-->我相信这应该会抛出错误,因为没有定义的构造函数支持这个

//statement 2
a.operator=(b.operator+(5));

//statement 3
a.operator=(a.operator=(b.operator+(c)));

//statement 4
a.operator=(b.operator+(c.operator+(5)));

//statement 5
(c.operator=(a.operator+(a)))=(b.operator+(c)); then
lhs_result.operator=(rhs_result);

另外,我是否正确解读了上面的第 5 条陈述?

最佳答案

如果你希望语句 4 被编译,那么声明运算符如下

const X& operator+ (int m) const;

问题是在这个语句中

a = b + c + 5;

b + c 是一个常量对象。见相应的运算符声明

        const X& operator+ (const X& rhs) const;

你不能为一个常量对象调用一个非常量成员函数。

考虑加法运算符 + 从左到右分组。来自 C++ 标准(5.7 加法运算符)

1 The additive operators + and - group left-to-right.

关于声明 5

(c = a + a) = b + c; //statement 5

那么它有未定义的行为,因为赋值运算符的操作数的计算没有排序。因此,要么首先对表达式 (c = a + a) 求值,然后对表达式 b + c 求值。或先对表达式 b + c 求值,然后才对表达式 (c = a + a) 求值

关于c++ - 二元运算符 + , = 用 const 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27821297/

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