1

好吧,视觉工作室给了我一个警告。我确实理解警告并且我知道这不是错误。但是我不明白为什么我会看到警告 - 更糟糕的是,我因此不明白如何预防/它会带来哪些潜在问题。

代码写在下面,一个函数应该通过在容器中查找给定的“id”来返回对std::function<>( ) 的 (const) 引用。 容器成对存储。fun_type_cref
[id, fun_type]

Handler::fun_type_cref Handler::Overwrite() const
{
    auto i(container.find(OVERWRITE));
    if (i != container.end()) {
        return *i;
    } else {
        return nullptr;
    }
}

两个返回语句都出现的确切警告是

警告 C4172:返回局部变量或临时地址

是什么导致了这个错误?我只是返回对包含对象的引用,对吗?*i不会创建对象的副本,对吗?我在任何地方都看不到自己在获取某物的地址?

我可以理解第二个,因为我返回了对本地创建的函数对象的引用,但是没有特定情况可以返回对编译时常量的引用或类似的东西吗?


编辑:很好地解决了第一个问题,一个简单的类型不匹配似乎因为我忘记实际返回返回的迭代器的正确部分 - 应该是return i->second. 奇怪的视觉工作室没有给我一个类型不匹配的错误,编译器可以将 a 转换std::pair<std::string, std::function<...> >为 astd::function<...>

现在问题变成了关于第二个返回部分的问题——我希望函数在“OVERWRITE”id 不在包含的函数表中时返回一个“默认值”(这将是一个 NO-OP)......定义这样的事情?因为我不想返回迭代器......

4

1 回答 1

1

尝试将 return i 替换为:

return (*i).second

于 2013-04-17T13:39:11.483 回答