Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么是";“返回对临时对象的引用”;编译器警告未触发?_C++_Visual C++_Pass By Reference_Msvc12 - Fatal编程技术网

C++ 为什么是";“返回对临时对象的引用”;编译器警告未触发?

C++ 为什么是";“返回对临时对象的引用”;编译器警告未触发?,c++,visual-c++,pass-by-reference,msvc12,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::I

考虑以下简单代码:

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;
}
// main.cpp

struct A
{
};


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

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

int main()
{
    return 0;
}
它有一个bug,我很惊讶只花了大约30分钟就注意到了:
iterator::operator*()
返回对临时对象的引用。通常它会发出警告。在这种情况下为什么不呢

MSVC 2013(v120工具集),使用
/W4
编译


另外,这是一个1级警告。

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

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

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;
}
// main.cpp

struct A
{
};


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

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

int main()
{
    return 0;
}

FWIW,预期的“警告C4172:返回局部变量或临时地址”是我得到的。这可能是一个错误。MSVS 2015发布警告C4172:返回局部变量或临时变量的地址,是因为您没有返回临时对象吗?您正在存储对容器的引用,因此如果该容器被破坏,您会得到一个segfault?如果该对象的参数container被定义为edit:ah right,那么我看不出该对象在操作符的作用域中是如何临时的,因为container操作符返回了临时的…对不起,我的所有错误noise@vu1p3n0x:我正在返回对临时的引用。只要
运算符*
返回,引用就无效。@vu1p3n0x
\u容器[\u idx]
生成临时引用。试图通过引用返回结果不会有好的结果。良好的旧Microsoft状态:关闭为不会修复不会修复这不是一个错误,但被MS视为一项功能,无论如何,它是自vs2015此feautre被删除后有意添加的,您可以在此处找到类似的报告,详细解释其不好的原因: