C++ C++;11/自动为我分配一个布尔?

C++ C++;11/自动为我分配一个布尔?,c++,c++11,C++,C++11,嗨,我想在我的代码中应用自动转换介绍,但我被卡住了。 如果我加上自动 TGuildMemberContainer::iterator it; if ((it = m_member.find (p->dwPID)) == m_member.end()) { m_member.insert (std::make_pair (p->dwPID, TGuildMember (p->dwPID, p->bGrade, p->isGeneral, p->bJob,

嗨,我想在我的代码中应用自动转换介绍,但我被卡住了。 如果我加上自动

TGuildMemberContainer::iterator it;
if ((it = m_member.find (p->dwPID)) == m_member.end())
{
    m_member.insert (std::make_pair (p->dwPID, TGuildMember (p->dwPID, p->bGrade, p->isGeneral, p->bJob, p->bLevel, p->dwOffer, p->szName)));
}
else
{
    TGuildMember& r_gm = it->second;
    r_gm.pid = p->dwPID;
    r_gm.grade = p->bGrade;
    r_gm.job = p->bJob;
    r_gm.offer_exp = p->dwOffer;
    r_gm.is_general = p->isGeneral;
}
自动分配一个
bool

if (auto it = m_member.find (p->dwPID) == m_member.end())
这就是VisualStudioIntelissense


我的问题是,为什么自动为我分配布尔值而不是corect迭代范围?

因为编译器正在将其解析为:

if ( bool it = m_member.find (p->dwPID) == m_member.end())
这是一个布尔表达式。你不能把它写成:

    if (auto it = (m_member.find (p->dwPID) == m_member.end()))
因为这样把变量声明放在括号内是不允许的

我发现在
if
中创建变量很难理解。只需使用:

    if ((auto it = m_member.find (p->dwPID)) == m_member.end())

因为编译器正在将其解析为:

if ( bool it = m_member.find (p->dwPID) == m_member.end())
这是一个布尔表达式。你不能把它写成:

    if (auto it = (m_member.find (p->dwPID) == m_member.end()))
因为这样把变量声明放在括号内是不允许的

我发现在
if
中创建变量很难理解。只需使用:

    if ((auto it = m_member.find (p->dwPID)) == m_member.end())

在C++17中,这可以按如下方式完成

    const auto it = m_member.find(p->dwPID);
    if (it == m_member.end())
    ...

这避免了另一个答案中提到的范围问题。

在C++17中,这可以按如下方式完成

    const auto it = m_member.find(p->dwPID);
    if (it == m_member.end())
    ...

这就避免了另一个答案中提到的范围问题。

这里,用这些:
()
;-)它不能按照你看起来想要的方式来做,因为它是一个复杂的过程。您必须在条件之外声明变量(使用
auto
)它不能按照你看起来想要的方式来做,因为它是一个复杂的过程。您必须在条件之外声明变量(使用
auto
)。在您的示例中,在您的范围内有一个悬挂的迭代器
it
。在我看来,在这个例子中,仅仅为了强制作用域而使用多余的括号{}是一件混乱的事情。我更希望看到对条件声明的支持得到扩展…足够公平。我尽量减小封闭范围的大小,这样就不会有太大的问题。只有当变量的析构函数很重要(比如锁守卫)时,我才会支持{}。我发现很难阅读,因为我不喜欢将非bool变量强制转换为bool。我倾向于选择
if(ptr!=nullptr)
而不是
if(ptr)
。你们为什么总是使用const?我的意思是,我应该使用const intro evry auto transform吗?我总是使用const(除非我不能),因为它使我更容易对程序进行推理,也使编译器更容易对其进行推理(编译器对程序的推理越多,它就越能优化)。作为旁白,我喜欢在条件逻辑中定义变量,因为它强制作用域。在您的示例中,在您的范围内有一个悬挂的迭代器
it
。在我看来,在这个例子中,仅仅为了强制作用域而使用多余的括号{}是一件混乱的事情。我更希望看到对条件声明的支持得到扩展…足够公平。我尽量减小封闭范围的大小,这样就不会有太大的问题。只有当变量的析构函数很重要(比如锁守卫)时,我才会支持{}。我发现很难阅读,因为我不喜欢将非bool变量强制转换为bool。我倾向于选择
if(ptr!=nullptr)
而不是
if(ptr)
。你们为什么总是使用const?我的意思是,我应该使用const intro evry auto transform吗?我总是使用const(除非我不能),因为它使我更容易对程序进行推理,也使编译器更容易对其进行推理(编译器对程序的推理越多,它的优化效果越好)。