为什么不触发"returning reference to temporary object"编译器警告?

Why is the "returning reference to temporary object" compiler warning not triggered?

本文关键字:编译器 object 警告 temporary reference returning 为什么不 to      更新时间:2023-10-16

考虑此简单代码:

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编译。

p。S.这是C4172,一个1级警告。

看起来它是Visual Studio中的一个错误,您可以发现它是针对2012年的VS报告的,并且看来它仍然存在于2013年:

https://connect.microsoft.com/visualstudio/feedback/details/776530/warning-c4172-not-emittle

上面的链接可能是其他某些副本,此错误报告中的示例与您的示例代码看起来完全相同:

// main.cpp
struct A
{
};

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