Почему не сработало предупреждение компилятора "возвращающаяся ссылка на временный объект"?

Рассмотрим этот простой код:

struct Container {
    struct Item {};

    Item operator[](size_t /*index*/) const {
        return Item();
    }

    const Item& f() const {
        return operator[](0);
    }
};

int main()
{
    Container c;
    const Container::Item& item = *c.begin();

    return 0;
}

В нем есть ошибка, и я удивлен, что мне понадобилось около 30 минут, чтобы заметить: iterator::operator*() возвращает ссылку на временный объект. Обычно это выдает предупреждение. Почему не в этом случае?

MSVC 2013 (набор инструментов v120), скомпилированный с /W4,

PS Это C4172, предупреждение уровня 1.

1 ответ

Решение

Похоже, что это ошибка в Visual Studio, вы можете найти, что о ней сообщалось для VS 2012, и кажется, что она все еще присутствовала в 2013 году:

https://connect.microsoft.com/VisualStudio/feedback/details/776530/warning-c4172-not-emitted

Приведенная выше ссылка может быть дубликатом какой-либо другой, пример из этого отчета об ошибке выглядит так же, как ваш пример кода:

// main.cpp

struct A
{
};


struct B
{    
    A a() const {return A();}
};

struct C
{
    A const& a() const
    {
        return B().a();
    }
};

int main()
{
    return 0;
}
Другие вопросы по тегам