Почему не сработало предупреждение компилятора "возвращающаяся ссылка на временный объект"?
Рассмотрим этот простой код:
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;
}