如何在没有编译器警告的情况下返回对空字符串的const引用?

tcb

我有一个std::unordered_map<int, std::string>和一个函数GetString(int key)该函数需要一个int键,并从此映射返回一个字符串值。

当在地图上找不到键时,我必须返回一个空字符串。

#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;
}

问题是编译器给我这个警告

warning C4172: returning address of local variable or temporary

(使用MS Visual Studio 2013)或

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

(使用g ++ 4.9.2)

摆脱这种情况的一种方法是static const std::string,在顶部声明a并返回该值,而不是空字符串文字

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;
}

但是定义一个空的字符串文字似乎并不干净。有没有一种整洁的方式做到这一点?

更新:我的地图在启动过程中初始化了一次,然后从多个线程同时读取(使用GetString)。使用函数静态空字符串将不起作用,因为在Visual Studio的编译器中,函数静态变量不是以线程安全的方式初始化的。

Serge Ballesta

警告消息显式地说明了问题所在:您正在返回本地变量(""“)的地址,该地址将在函数返回后从堆栈中释放。最好返回a 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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在没有函数体的情况下打印函数的返回字符串?

来自分类Dev

如何在没有新数组的情况下读取字符串数组并返回字符串

来自分类Dev

如何在没有主机编译器的情况下创建Cuda模块

来自分类Dev

如何在没有编译器的情况下获得简单的Makefile教程

来自分类Dev

如何在没有主机编译器的情况下创建Cuda模块

来自分类Dev

如何在没有关于限制的警告的情况下sprintf编写字符串?

来自分类Dev

如何在没有直接ID引用的情况下从Strings.xml获取字符串数组的ID

来自分类Dev

C如何在没有编译器警告的情况下将地址打印为十进制值(非十六进制)

来自分类Dev

如何在没有Kotlin编译器警告的情况下将Class <*>与Java Boxed基本类型进行比较

来自分类Dev

如何在不得到编译器警告的情况下初始化char * args []

来自分类Dev

如何在不得到编译器警告的情况下初始化char * args []

来自分类Dev

如何在没有 .xml 和资源的情况下将字符串添加到微调器

来自分类Dev

编译器在没有明显原因的情况下返回clang错误1

来自分类Dev

如何在没有连接字符串的情况下打开EntityConnection

来自分类Dev

如何在python中没有regex的情况下检查字符串的要求?

来自分类Dev

如何在没有itoa()的情况下将任何变量更改为字符串?

来自分类Dev

如何在没有明确的定界符的情况下解析键值字符串?

来自分类Dev

java - 如何在没有任何for循环的情况下制作字符串替换程序?

来自分类Dev

如何在没有字符串的情况下验证正文响应?

来自分类Dev

如何在没有引号的情况下多次使用的字符串中查找单词

来自分类Dev

如何在不防止删除空字符串的情况下防止单词拆分?

来自分类Dev

如何在没有已知格式的情况下将字符串分成不同的子字符串

来自分类Dev

在没有注释的情况下应用尾递归时,是否有Scala编译器标志警告?

来自分类Dev

在没有警告的情况下将字符串转换为枚举

来自分类Dev

c-如何在没有输入且没有字符串的情况下中断scanf

来自分类Dev

为什么在没有引用运算符的情况下编译器无法决定要调用哪个函数?

来自分类Dev

将字符串文字分配给非const指针时,为什么我的C编译器没有警告?

来自分类Dev

如何在没有中断常量的情况下返回可引用的引用类型?

来自分类Dev

如何在不触发编译器警告的情况下针对集合类型使用Scala匹配/大小写

Related 相关文章

  1. 1

    如何在没有函数体的情况下打印函数的返回字符串?

  2. 2

    如何在没有新数组的情况下读取字符串数组并返回字符串

  3. 3

    如何在没有主机编译器的情况下创建Cuda模块

  4. 4

    如何在没有编译器的情况下获得简单的Makefile教程

  5. 5

    如何在没有主机编译器的情况下创建Cuda模块

  6. 6

    如何在没有关于限制的警告的情况下sprintf编写字符串?

  7. 7

    如何在没有直接ID引用的情况下从Strings.xml获取字符串数组的ID

  8. 8

    C如何在没有编译器警告的情况下将地址打印为十进制值(非十六进制)

  9. 9

    如何在没有Kotlin编译器警告的情况下将Class <*>与Java Boxed基本类型进行比较

  10. 10

    如何在不得到编译器警告的情况下初始化char * args []

  11. 11

    如何在不得到编译器警告的情况下初始化char * args []

  12. 12

    如何在没有 .xml 和资源的情况下将字符串添加到微调器

  13. 13

    编译器在没有明显原因的情况下返回clang错误1

  14. 14

    如何在没有连接字符串的情况下打开EntityConnection

  15. 15

    如何在python中没有regex的情况下检查字符串的要求?

  16. 16

    如何在没有itoa()的情况下将任何变量更改为字符串?

  17. 17

    如何在没有明确的定界符的情况下解析键值字符串?

  18. 18

    java - 如何在没有任何for循环的情况下制作字符串替换程序?

  19. 19

    如何在没有字符串的情况下验证正文响应?

  20. 20

    如何在没有引号的情况下多次使用的字符串中查找单词

  21. 21

    如何在不防止删除空字符串的情况下防止单词拆分?

  22. 22

    如何在没有已知格式的情况下将字符串分成不同的子字符串

  23. 23

    在没有注释的情况下应用尾递归时,是否有Scala编译器标志警告?

  24. 24

    在没有警告的情况下将字符串转换为枚举

  25. 25

    c-如何在没有输入且没有字符串的情况下中断scanf

  26. 26

    为什么在没有引用运算符的情况下编译器无法决定要调用哪个函数?

  27. 27

    将字符串文字分配给非const指针时,为什么我的C编译器没有警告?

  28. 28

    如何在没有中断常量的情况下返回可引用的引用类型?

  29. 29

    如何在不触发编译器警告的情况下针对集合类型使用Scala匹配/大小写

热门标签

归档