【发布时间】:2021-04-12 16:46:37
【问题描述】:
考虑这段代码:
if (int* p = nullptr) {
}
else {
std::cout << *p << std::endl;
}
这与带有 -std=c++17、-Wall、-Wextra 和 -pedantic-errors 的 clang 7.0.1 一起编译,不会生成任何警告。
我有两个问题:
-
这怎么可能?我一直认为这些变量的范围以 if 块结束。如果可能的话,我将不胜感激引用标准。
-
如果它是合法的,它至少不应该产生一个警告吗?这种特性有没有合理的应用?
【问题讨论】:
-
"我一直认为此类变量的作用域以 if 块结尾。" else is 部分if 块的。
-
我认为这与初始化后出现左括号有关
-
cppreference's description of if 提到“条件引入的名称范围,如果是声明,就是两个语句体的组合范围”
-
这对我来说似乎完全合理。在您的示例中,如果条件是某个复杂表达式的真实性,这为您提供了一种方法来声明一个变量来保存该表达式的值,并且您可能想在两个子句中的任何一个中知道该值是什么。
-
@NateEldredge • 你可以
if (int c = getchar(); c == EOF) ...
标签: c++ if-statement language-lawyer variable-declaration