C++类内实例化其他类报Map::value不是类型名,为何大括号初始化可行
问题解答
核心原因是触发了C的最令人头疼的解析规则(Most Vexing Parse),这是C语法优先级的设定导致的歧义问题:
- C++编译器会优先将任何符合函数声明格式的语句判定为函数声明,而非对象初始化语句
- 你写的
Snake snake(value);在编译器视角下会被解读为:声明一个返回值为Snake类型、名为snake的函数,该函数接收1个类型为value、参数名为空的参数。但你代码里的value是Map类的成员变量,不是合法类型名,因此直接抛出「Map::value不是类型名」的报错。
而你改用大括号(列表初始化)的写法可以正常运行的原因是:
大括号初始化是C++11引入的语法,它的语义明确为「执行对象初始化」,不存在函数声明的歧义,编译器会直接按成员初始化逻辑处理,用Map类的value成员作为参数构造snake对象。
补充你代码里的两个小笔误:
Chunk的构造函数里你只写了this->value;,没有赋值操作,要改成this->value = value;才能正常初始化成员Snake snake { value; }里的分号是多余的,正确写法是Snake snake { value };,类定义的末尾也需要补分号。
内容的提问来源于stack exchange,提问作者Venci
相关产品推荐
相关产品推荐

