引用临时和警告
reference to a temporary and warnings
我浪费了一个小时在我的代码中找到这个问题:
vector<string> & input_variables = parse_xml(xml_path)["variables"];
其中parse_xml
是返回std::map<std::string, std::vector<std::string> >
的函数。为什么 gcc 不警告我(用 -Wall)?我错过了一些标志吗?
你引用了一个被销毁的对象。在C++11中,编写了新的语言功能,使此代码非法。如果要使用它,则必须将数据复制或交换到局部变量中。GCC 不会警告您,因为 C++03 没有提供必要的功能来防止这种情况。
从技术上讲,operator[]
的返回值是一个左值。不幸的是,它即将被它的主人std::map
摧毁。
GCC 不会警告您,因为从技术上讲,没有什么可警告的。
parse_xml()
按值返回std::map
,这是一个临时值。调用 operator[]
将返回引用。编译器无法在本地知道此引用实际上是临时std::map
的一部分。据编译器所知,operator[]
可能会返回对全局或其他内容的引用。
,它与外部临时变量的生存期相关联。但是函数的返回值(如operator[]
)不是那么链接。
它没有警告您的原因是,您通过一系列有效步骤获得了无效操作:
struct X
{
int c;
int & operator [] (int) { return c; } /* this is perfectly OK */
};
X f()
{
return X(); /* this is perfectly OK */
}
int main()
{
int &x = f()[1]; /* can apply [] on temporary, therefore OK */
}
您可以通过将f()
的结果显式标记为 const
来防止这种情况发生。
相关文章:
- 隐式重新解释引用时强制转换,没有警告/错误
- 警告 C4101 未引用的局部变量
- 链接时突然收到maxrregcount警告和未定义的引用错误
- 警告:返回对临时 - 奇怪情况的引用(对 Rvalue 的澄清)
- 是否有将引用返回到临时引用的C++警告?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- C++ 当容器在使用前被破坏/修改时发出警告(通过引用元素或迭代器使用)
- 是否有任何C++编译器可以发出悬而未决的引用警告?
- 警告#13212:引用需要堆栈对齐功能的EBX
- 使用引用不会导致有关未定义行为的警告
- 三元运算符:编译器不发出局部变量警告的返回引用
- 为什么 C++ 编译器不警告返回对局部变量的引用
- 模板类型推导警告返回对本地临时对象的引用
- 为什么 g++ 警告返回对临时的引用
- 返回对函数参数的引用时没有 clang 警告
- 尝试将 std::vector<std::p air<T, U>> 转换为其左值引用时收到 VS 编译器警告 C4239
- GCC 关于隐式取消引用的警告
- 警告-未引用的内联函数已被删除
- 如何在没有编译器警告的情况下返回对空字符串的 const 引用?
- 没有返回对局部变量的引用的编译器警告