检测成员变量的阴影

时间:2014-03-31 22:52:22

标签: c++ initialization

我有一个A级成员:

std::shared_ptr<class B> m_mySharedPtr;

我有一个Init方法:

A::Init()
{
  std::shared_ptr<class B> m_mySharedPtr = m_factory->CreateMySharedPtr();
}

我花了一些时间才意识到在我的Init之后,shared_ptr为空。 那是因为我重新定义了成员,被视为本地成员,因此在A :: Init()范围之外被释放。

我打算写:

A::Init()
{
  m_mySharedPtr = m_factory->CreateMySharedPtr();
}

编译器为什么不抱怨?至少有警告? 类似于&#34;成员重新定义。&#34;

在特定情况下确实有效/有用吗?

也许我的警告级别太低了。

谢谢,

文森特

1 个答案:

答案 0 :(得分:3)

如果您正在使用GCC或Clang,请使用-Wshadow标志。你得到这样的编译器输出:

test.cc:5:7: warning: declaration shadows a field of 'A' [-Wshadow]
                std::shared_ptr<class B> m_mySharedPtr = m_factory->CreateMySharedPtr();
                                         ^
test.cc:2:15: note: previous declaration is here
        std::shared_ptr<class B> m_mySharedPtr;