我有一个std::unordered_map<int, std::string>函数GetString(int key),它接受一个int键并从这个map返回一个字符串值.
当在地图中找不到密钥时,我必须返回一个空字符串.
#include <iostream>
#include <string>
#include <unordered_map>
std::unordered_map<int, std::string> map
{
{ 5, "somelongstring" }
};
const std::string& GetString(int key)
{
auto iterator = map.find(key);
if (iterator == map.end())
{
return "";
}
return iterator->second;
}
int main()
{
std::cout << GetString(1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
问题是编译器给了我这个警告
warning C4172: returning address of local variable or temporary
Run Code Online (Sandbox Code Playgroud)
(使用MS Visual Studio 2013)或
warning: returning reference to temporary [-Wreturn-local-addr]
Run Code Online (Sandbox Code Playgroud)
(使用g ++ 4.9.2)
我发现的一种方法是static const std::string在顶部声明一个并返回它而不是空字符串文字
static const std::string Empty = "";
const std::string& GetString(int key)
{
auto iterator = map.find(key);
if (iterator == map.end())
{
return Empty;
}
return iterator->second;
}
Run Code Online (Sandbox Code Playgroud)
但是定义一个空字符串文字似乎不太干净.有一个巧妙的方法来做到这一点?
更新:我的地图在启动期间初始化一次,然后从多个线程同时读取(使用GetString).使用函数静态空字符串将不起作用,因为函数静态变量未在Visual Studio的编译器下以线程安全方式初始化.
Ser*_*sta 11
警告消息明确说明问题是什么:你返回一个局部变量(""")的地址,它将在函数返回后从堆栈中释放出来.返回一个就好了std::string,因为你要构造一个新的字符串.函数局部变量,但是当你返回a时,std::string&你会使用局部变量.
但是当你返回一个静态值时,只需将其设为静态:
const std::string& GetString(int key)
{
static const string empty = "";
auto iterator = map.find(key);
if (iterator == map.end())
{
return empty;
}
return iterator->second;
}
Run Code Online (Sandbox Code Playgroud)