C++11 auto/我有些不懂

C++11 auto /I dont understand something

本文关键字:不懂 auto C++11      更新时间:2023-10-16

好的。这是我的代码:

CShop::~CShop()
{
    TPacketGCShop pack;
    pack.header = HEADER_GC_SHOP;
    pack.subheader  = SHOP_SUBHEADER_GC_END;
    pack.size = sizeof(TPacketGCShop);
    Broadcast(&pack, sizeof(pack));
    GuestMapType::iterator it;
    it = m_map_guest.begin();
    while (it != m_map_guest.end())
    {
        LPCHARACTER ch = it->first;
        ch->SetShop(NULL);
        ++it;
    }
    M2_DELETE(m_pGrid);
}

Soo我有GuestMapType::iterator it;和这个it = m_map_guest.begin();

如果我把我的函数做成这样就可以了吗?

CShop::~CShop()
{
    TPacketGCShop pack;
    pack.header = HEADER_GC_SHOP;
    pack.subheader  = SHOP_SUBHEADER_GC_END;
    pack.size = sizeof(TPacketGCShop);
    Broadcast(&pack, sizeof(pack));
    auto it = m_map_guest.begin();
    while (it != m_map_guest.end())
    {
        LPCHARACTER ch = it->first;
        ch->SetShop(NULL);
        ++it;
    }
    M2_DELETE(m_pGrid);
}

我删除了GuestMapType::迭代器it;简化我的代码?我的问题是。这会影响我的程序吗?有风险吗?

这很好,在我看来,用auto声明迭代器是一种很好的做法,至少有两个原因:

1-一般来说,迭代器的类型很长。你打字越少,你打字错误的次数就越少。它也使代码更加清晰,因为在该上下文中隐藏了一个无关紧要的实现细节

2-前向兼容性:当您修改代码时,即迭代器类型名称的名称,您不必更改与auto一起使用的代码。毕竟,您希望使用这种类型的迭代器,与它的名称无关。

如果m_map_guest.begin()的返回类型可以确定为GuestMapType::iterator,则应该没有差异。

auto类型并不是什么神奇的动态/弱类型,它只是编译器的一个指标,它应该计算出strong类型本身,而不需要明确它1。两条线之间存在功能差异:

int i = 7;
auto i = 7;

因为编译器使用第二示例中的CCD_ 8的类型来推断CCD_。

您通常应该尽可能使用auto,原因与您应该在C:中使用第二个相同

ttype *x = malloc(sizeof (ttype));
ttype *x = malloc(sizeof (*x));

如果类型更改为其他类型,则后者只需要一个更改-这在auto中变得更加重要,因为实际类型和声明可以更广泛地分离。


1当然,如果返回类型不同,例如隐式转换或子类,编译器就更难确定您想要的类型。因此,在这些情况下,它可能不起作用。