我正在查找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);
}
答案 0 :(得分:10)
getProperty
会返回bmd2::string
而不是std::string
。因此,必须从std::string
隐式构造/转换bmd2::string
。这个std::string
当然是一个新的临时对象。
虽然返回对临时的引用实际上并不违法,但使用这样的引用(如果超出范围)将导致UB,因此编译器会警告您。