if语句条件中声明的变量需可转换为bool吗?文档与编译矛盾解惑
C++ if语句条件声明的类型要求疑问
问题背景
根据cppreference文档,if语句的语法规定如下:
attr(可选) if constexpr(可选) ( init-statement(可选) condition ) statement-true
...
condition - 以下两种情况之一:
- 可按语境转换为
bool的表达式- 带有花括号或等号初始化器的单个非数组变量声明。
但文档未明确要求第二种情况中的变量需满足“可按语境转换为bool”的条件。于是编写了如下测试代码:
struct Foo { int val; }; int foo() { if (Foo x{}) { return 1; } return 0; }
使用gcc和clang编译均报错:Clang提示error: value of type 'Foo' is not contextually convertible to 'bool',gcc提示类似的error: could not convert 'x' from 'Foo' to 'bool'。
疑问:这是文档的共识性遗漏,还是存在理解偏差?
更新与解答
在C++标准中找到相关说明,翻译如下:
除
switch语句外,若语句中的条件是带初始化的声明,则该条件的值是所声明变量按语境转换为bool后的值。
内容的提问来源于stack exchange,提问作者XuanInsr
相关产品推荐
相关产品推荐

