为什么C++中返回圆括号包裹的花括号初始化vector会编译错误?
错误原因
- C++11及更高版本中,
return语句支持直接后跟花括号初始化列表,用来直接构造返回值类型的对象,所以return {x, y};是合法语法,会直接调用std::vector<int>的初始化列表构造函数生成返回值。 - 花括号初始化列表(braced-init-list)本身不属于C++表达式,没有对应类型和值,只能出现在允许初始化器的特定语法位置,不能被包裹在圆括号中——圆括号要求内部必须是一个合法的表达式。
- 当你写
return({x, y});时,编译器尝试将括号内的{x, y}解析为表达式失败,错误地将内容识别为逗号运算符表达式:将{x解析为代码块开头,x作为单独的表达式语句求值后被丢弃(对应报错信息里的(void)0),逗号后的y被识别为整个表达式的返回值,类型为int,自然无法转换为std::vector<int>,同时还会报代码块闭合的}前缺少分号的错误,和你看到的报错完全吻合。
可选的合法写法
如果确实需要在返回时加括号,可以显式指定类型构造对象:
return (std::vector<int>{x, y}); return std::vector<int>({x, y});
这两种写法括号内部都是合法的std::vector<int>类型表达式,语法上完全合规。
内容的提问来源于stack exchange,提问作者sol
相关产品推荐
相关产品推荐

