为什么"返回对临时对象的引用"编译器警告未触发?

时间:2016-06-17 18:41:46

标签: c++ visual-c++ pass-by-reference msvc12

考虑这个简单的代码:

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 个答案:

答案 0 :(得分:1)

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

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

以上链接可能与其他链接重复,此错误报告中的示例与示例代码完全相同:

container.get(0).get(1) //would return only 26.