返回指针到本地变量??(警告C4172)

Return pointer to local variable?? (warning C4172)

本文关键字:警告 C4172 变量 指针 返回      更新时间:2023-10-16

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