我有一个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;
在特定情况下确实有效/有用吗?
也许我的警告级别太低了。
谢谢,
文森特
答案 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;