C++中=与{}在赋值相关操作的区别及编译错误解析
Token{ch}与Token=ch的含义差异及编译错误原因
1. Token {ch}; 的含义
这是C++11引入的直接列表初始化语法,作用是创建一个匿名的Token类临时对象:
- 编译器会匹配
Token类中对应的构造函数(此处为Token(char ch)),用传入的ch值初始化临时对象的kind成员。 - 这个临时对象仅在当前语句的生命周期内存在,语句执行完毕后会被自动销毁,除非它被用来初始化变量或绑定到
const引用。
2. Token = ch; 编译错误的原因
赋值操作符=的使用有严格要求:赋值运算符的左侧必须是一个已经初始化完成的对象实例,而不能是类类型名。
- 你写的
Token = ch;中,Token是类的类型名称,不是一个已存在的Token对象,编译器无法识别这是合法的赋值操作,因此抛出expected unqualified-id错误——它期望左侧是一个合法的对象标识符(比如你定义的Token对象变量名),而非类型名。
如果想要实现类似的赋值逻辑,你需要先创建一个Token对象,再对其赋值(同时还需要确保类支持对应的赋值操作),比如:
// 先创建一个Token对象(用列表初始化) Token t{ch}; // 如果需要给这个对象重新赋值,需确保Token支持char类型的赋值(比如重载operator=(char),或存在从char到Token的隐式转换) t = 'b';
注意:如果直接写
Token t;会报错,因为Token类没有定义默认构造函数,必须显式调用带参数的构造函数来初始化对象。
内容的提问来源于stack exchange,提问作者nostromo
相关产品推荐
相关产品推荐

