返回指针到本地变量??(警告C4172)
Return pointer to local variable?? (warning C4172)
visual studio给了我一个警告。我确实理解这个警告& &;我知道这不是一个错误。然而,我不明白为什么我看到了警告,更糟糕的是,我不明白如何预防/它可能带来什么潜在的问题。
下面的代码是一个函数,通过在容器中查找给定的"id",返回对std::function<>
(fun_type_cref
)的(const)引用。
容器按[id, fun_type]
对存储
Handler::fun_type_cref Handler::Overwrite() const
{
auto i(container.find(OVERWRITE));
if (i != container.end()) {
return *i;
} else {
return nullptr;
}
}
在两个返回语句中出现的确切警告是
返回本地变量或临时
的地址
是什么导致这个错误?我只是返回了一个被包含对象的引用,对吧?*i
不会创建对象的副本,对吧?我不能在任何地方记下某个东西的地址?
我可以理解第二,因为我返回一个引用到本地创建的函数对象,但是不是有一个特定的情况下返回引用编译时间常数或类似的东西?
编辑:很好地解决了第一个问题,一个简单的类型不匹配,似乎是我忘记返回返回迭代器的正确部分——应该是return i->second
。Strange visual studio没有给我一个类型不匹配的错误,编译器可以将std::pair<std::string, std::function<...> >
转换为std::function<...>
现在的问题已经成为关于第二个返回部分-我希望函数返回一个"默认值"(这将是一个NO-OP),当"OVERWRITE"id不在包含的函数表中…人们如何定义这样的事情?
尝试用:
return (*i).second
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- VS2013警告C4172返回Rvalue
- 返回指针到本地变量??(警告C4172)
- 是否存在不应将 C4172 视觉C++警告视为错误的任何情况