嵌套if中的作用域不明确
Scope ambiguity in nested if
假设有一个类Foo,如
class Foo {
public:
void bar();
operator bool() const { return true; }
};
那么就可以进行
if(Foo foo = Foo())
{
if(Foo foo = Foo())
{
foo.bar();
}
}
现在我很难理解这里正在进行的范围解析(我本以为重新解析foo会出现编译器错误)。
我希望foo.bar()在第二个foo上执行(它的作用域"更近"),但我是否确信它实际上是一个与第一个foo不同的对象?此外,它们是否在各自if块的末尾分别独立处理(称为析构函数)?
C++非常乐意用相同的名称声明一个变量,只要它在嵌套的范围内,就不会有歧义。
我希望foo.bar()在第二个foo上执行(它的作用域"更近")
你是正确的
但我是否确信它实际上是一个与第一个foo不同的对象?
是
此外,它们是否在各自if块的末尾分别独立处理(称为析构函数)?
是
我希望foo.bar()在第二个foo上执行(它的作用域"更近")
正确。
但我是否确信它实际上是一个与第一个foo不同的对象?
是的。
此外,它们是否在各自if块的末尾分别独立处理(称为析构函数)?
是的,你找到了。
在示例中使用if语句和类对象初始化往往会混淆相关点,即内部作用域中的声明完全合法,并在外部作用域中隐藏同名声明。
一个可能更清晰的例子:
#include <iostream>
int main() {
const int x = 10;
std::cout << "outer x is " << x << "n";
{
const double x = 12.34;
std::cout << " inner x is " << x << " (it hides the outer x)n";
}
std::cout << "outer x is still " << x << " (inner x no longer exists)n";
}
输出为:
outer x is 10
inner x is 12.34 (it hides the outer x)
outer x is still 10 (inner x no longer exists)
请注意,内部和外部x
甚至不属于同一类型。
虽然这是合法的,但通常不是一个好主意;编译器对它没有问题,但它可能会让人类读者感到困惑。如果使用g++ -Wshadow
进行编译,则会收到警告:
c.cpp: In function ‘int main()’:
c.cpp:6:22: warning: declaration of ‘x’ shadows a previous local
c.cpp:3:15: warning: shadowed declaration is here
相关文章:
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 如何确保 Visual C++ 不允许作用域枚举访问?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- 我的boost managed_shared_memory在离开作用域时似乎不会从内存空间中取消映射
- c++ 指针在离开作用域后不会停留
- 为什么 for 循环不能定义两个作用域的变量?
- 错误:数组大小表达式必须具有整型或无作用域枚举类型,而不是'double'
- 不带内部作用域的 if 语句
- 作用域在两个类实现之间不完全独立
- 为什么函数作用域不允许类前向声明?
- 作用域问题:如何从类外查看(不访问也不修改!)私有属性
- 作用域中的范围,做还是不做?
- 为什么内联函数看不到作用域内部?
- 如何在类的作用域中定义函数,而不是将其定义为成员函数
- 在类作用域内不能将“static_assert”与“sizeof”一起使用(但方法作用域可以)
- CMake add_definitions的作用域不在当前目录中
- 为什么 noexcept 说明符的作用域不在声明的方法内?
- 不能在块作用域中使用 SDL2 变量
- 嵌套if中的作用域不明确
- 遇到getline、fstream、作用域不一致的问题