C++ 嵌套if中的作用域模糊

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”),但我

假设一个人有一个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”),但我是否保证它实际上是与第一个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