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

时间:2013-04-17 13:33:43

标签: c++ scope return-by-reference

视觉工作室给了我一个警告。我明白这个警告&我知道这不是一个错误。但是我不明白为什么我会看到这个警告 - 更糟糕的是我因此不明白如何预防/它可能带来什么样的潜在问题。

代码写在下面,这个函数应该通过在容器中查找给定的“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;
    }
}

两个return语句都出现了确切的警告

  

警告C4172:返回本地变量的地址或临时

导致此错误的原因是什么?我只是返回对包含对象的引用,对吧? *i不会创建对象的副本,对吧?我看不到自己在哪里拿东西的地址?

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


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

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

1 个答案:

答案 0 :(得分:1)

尝试通过以下方式替换return i:

return (*i).second