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
相关产品推荐
相关产品推荐

