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

C++移动构造函数中使用大括号初始化报错问题咨询

为什么函数体里不能用变量{值}的形式修改成员?

这本质是C++语法规则的限制,得先分清初始化和赋值的语法边界:

两种场景的语法差异

  • 在构造函数的成员初始化列表(冒号后的部分):size{other.size}是合法的,因为这是在初始化当前对象的新成员,属于C++11引入的列表初始化语法,用来替代传统的括号初始化。
  • 在构造函数的函数体内部:other.size是已经完全初始化的成员变量(来自传入的右值引用对象other),这时other.size{0}不属于任何合法的语句语法——C++里X{Y}的写法只能用来初始化新对象/变量,不能用来修改已有变量的值。编译器会把这个写法解析成非法结构,所以抛出expected ";" before "{" token的错误。

怎么在函数体里用类似风格的写法?

如果偏好花括号的写法,可以用std::exchange来实现,它能同时完成赋值和返回旧值的操作,写法更统一:

#include <utility>

class Entity{
private:
    char* buf;
    int size;

public:
Entity(Entity&& other):
    size{other.size}, buf{other.buf}
    {
        std::exchange(other.size, 0);
        std::exchange(other.buf, nullptr);
    }
};

当然,直接用赋值语句other.size = 0;是最直观且无额外依赖的写法,完全没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:40:30