You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中内置int与自定义Int类自增表达式编译差异咨询

为什么内置int的++i++编译报错,自定义Int类却可以?

一、内置int代码报错的原因

对于C++内置的int类型,增量运算符的行为由标准严格规定:

  • 后置++(i++):返回操作数原来的临时值(右值),这个值无法被修改。
  • 前置++(++i):要求操作数是左值(可被修改的对象),执行后返回左值本身。

++i++会被编译器解析为++(i++):先执行i++得到一个右值,再尝试对这个右值执行前置++。但前置++不允许操作右值,因此触发编译错误:error: lvalue required as increment operand。

二、自定义Int类代码能编译的原因

看自定义Int类的运算符重载实现:

struct Int {
  int i;
  Int(int i = 0) : i{i} {}
  Int& operator++() {++i; return *this;} // 前置++:返回左值引用
  Int operator++(int) {Int t{*this}; ++i; return t;} // 后置++:返回值类型(右值)
};

同样,++i++被解析为++(i++),但自定义类的运算符行为由重载函数决定:

  1. 执行i++:调用后置operator++(int),返回一个临时的Int对象(保存了i原来的值7,同时原i的成员被加1为8)。
  2. 对临时对象执行++:调用前置operator++()——由于这个成员函数没有添加引用限定符(ref-qualifier),C++允许右值(临时对象)调用非const成员函数。执行后,临时对象的成员被加1为8,返回该临时对象的引用。
  3. 最后用这个经过前置++的临时对象初始化j,整个过程符合语法规则,因此可以正常编译。

如果想要让自定义类的前置++也禁止右值调用,可以给前置运算符添加引用限定符:

Int& operator++() & {++i; return *this;} // 仅允许左值调用

此时++i++也会编译报错,和内置int的行为一致。

内容的提问来源于stack exchange,提问作者apostol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:29:54