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被删除后有意添加的,您可以在此处找到类似的报告,详细解释其不好的原因: