std :: map :: at返回警告"返回对临时"的引用在调用堆栈中的某个地方

时间:2014-02-18 22:46:44

标签: c++ c++11

我正在查找std::map中密钥的值。我在Dataset :: getProperty()中得到以下错误:

returning reference to temporary [-Wreturn-local-addr]

调用堆栈中的临时创建位置是什么?我认为std::map::at返回了对左值的引用,因为我不断返回reference-to-const原始调用者将引用左值。

数据集

class Dataset
{
  private:
    PropertyCollection properties;

  public:
    const std::string & getProperty(const std::string & key) const;

  ...
}

const std::string & Dataset::getProperty(const std::string & key) const
{
  // WARNING: returning reference to temporary [-Wreturn-local-addr]
  return properties.getProperty(key);
}

PropertyCollection

class PropertyCollection
{
  private:
    std::map<std::string, std::string> properties;

  public:
    const bmd2::string & getProperty(const bmd2::string & key) const

  ...
}

const std::string & PropertyCollection::getProperty(const std::string & key) 
      const
{
  try {
    return properties.at(key);
  } catch (std::out_of_range & e) {
    ...
  }

主要

int main() {
  ...
  std::string key ("Cats");
  std::string value = dataset.getProperty(key);
}

1 个答案:

答案 0 :(得分:10)

getProperty会返回bmd2::string而不是std::string。因此,必须从std::string隐式构造/转换bmd2::string。这个std::string当然是一个新的临时对象。

虽然返回对临时的引用实际上并不违法,但使用这样的引用(如果超出范围)将导致UB,因此编译器会警告您。