c++ - 返回指向局部变量的指针?? (警告 C4172)

标签 c++ scope return-by-reference

好吧,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/

相关文章:

c++ - 遍历结构元素的 vector

c++ - 从 C++ 方法返回引用

c++ - 如何返回对在方法内创建的对象的引用

c++ - 在 C++ 中重载 + 和 += 运算符

c++ - 如何在 C++ 中初始化静态指针?

c++ - 将一个函数声明为 transaction_safe 就足够了,所以它们可以线程安全地使用吗?

c++ - 模板函数和非模板函数的调用顺序

javascript - BackboneJS : Avoid calling _. 绑定(bind)()

scope - Google 驱动器 API 范围 : https://www. googleapis.com/auth/drive

javascript - 在 CrossRider 的 appAPI.ready() 函数中创建的全局变量不可用于页面?