好吧,visual studio 给了我一个警告。我确实理解警告,而且我知道这不是错误。但是我不明白为什么我会看到警告 - 更糟糕的是我因此不明白如何预防/它会带来什么潜在问题。
代码写在下面,一个函数应该返回对 std::function<>
的(const)引用( fun_type_cref
) 通过在容器中查找给定的“id”。
容器存储为 [id, fun_type]
对。
Handler::fun_type_cref Handler::Overwrite() const
{
auto i(container.find(OVERWRITE));
if (i != container.end()) {
return *i;
} else {
return nullptr;
}
}
在两个 return 语句中出现的确切警告是
warning C4172: returning address of local variable or temporary
是什么导致了这个错误?我只是返回对包含对象的引用,对吗? *i
不会创建对象的拷贝,对吗?我看不到自己在任何地方获取某物的地址?
我可以理解第二个,因为我返回了对本地创建的函数对象的引用,但是没有返回对编译时间常量或类似内容的引用的特定情况吗?
编辑:
很好地解决了第一个问题,一个简单的类型不匹配,因为我忘记实际返回返回的迭代器的正确部分 - 应该是 return i->second
.奇怪的 visual studio 没有给我类型不匹配错误,编译器可以转换 std::pair<std::string, std::function<...> >
到 std::function<...>
现在问题变成了第二个返回部分——我希望函数在“OVERWRITE”id 不在包含的函数表中时返回一个“默认值”(这将是一个 NO-OP)...如何定义这样的事情?因为我不想返回迭代器...
最佳答案
尝试将 return i 替换为:
返回 (*i).second
关于c++ - 返回指向局部变量的指针?? (警告 C4172),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16061502/