C++ 嵌套if中的作用域模糊
假设一个人有一个Foo类,比如C++ 嵌套if中的作用域模糊,c++,scope,C++,Scope,假设一个人有一个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上执行(它的作用域是“closer”),但我
class Foo {
public:
void bar();
operator bool() const { return true; }
};
那就可以了
if(Foo foo = Foo())
{
if(Foo foo = Foo())
{
foo.bar();
}
}
现在我很难理解这里的作用域解析(我原以为重新定义foo时会出现编译器错误)
我希望foo.bar()在第二个foo上执行(它的作用域是“closer”),但我是否保证它实际上是与第一个foo不同的对象?此外,它们是否在各自的if块的末尾分别进行了处理(称为析构函数)
我希望foo.bar()在第二个foo上执行(它的作用域是“closer”)
对
但我能保证它和第一个食物是不同的吗
对
此外,它们是否在各自的if块的末尾分别进行了处理(称为析构函数)
是的,你已经知道了。C++很乐意为你声明一个同名的变量,只要它在一个嵌套的范围内,这样就不会有歧义 我希望foo.bar()在第二个foo上执行(它的作用域是“closer”) 你说得对 但我能保证它和第一个食物是不同的吗 对 此外,它们是否在各自的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";
}
请注意,内部和外部x
s甚至不是同一类型
虽然这是合法的,但通常不是一个好主意;编译器对此没有问题,但可能会让读者感到困惑。如果使用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
这里没有任何含糊不清的地方。该标准清楚地描述了范围和潜在范围之间的差异。但是,这并不是一个好主意,所以不要这样做!对我来说,这更像是一种模棱两可的感觉^^这被称为阴影,通常不是一个好主意。尽管有时我们还是会这样做:
structss{s(intn):n(n){}intn;}代码>@BlackBear:为什么会有?在相同的范围内,它没有重新定义。正如Matt T解释的(见),只要在嵌套的范围内,同一个新变量的C++就可以了。如果它在同一个范围内,那么第二个声明就是一个问题。
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