为什么在C ++中将字符串引用成员变量设置为空字符串?

氧化铁

考虑以下代码:

class Foo
{
private:
    const string& _bar;

public:
    Foo(const string& bar)
        : _bar(bar) { }

    const string& GetBar() { return _bar; }
};

int main()
{
    Foo foo1("Hey");
    cout << foo1.GetBar() << endl;

    string barString = "You";
    Foo foo2(barString);
    cout << foo2.GetBar() << endl;
}

当我执行此代码时(在VS 2013中),该foo1实例的_bar成员变量中包含一个空字符串,foo2的相应成员变量中包含对值“ You”的引用。这是为什么?

更新:在这个示例中,我当然使用了std :: string类。

模板男孩

对于Foo foo1("Hey")编译器必须执行从const char[4]的转换std::string它创建一个类型的prvalue std::string该行等效于:

Foo foo1(std::string("Hey"));

引用绑定从prvalue到发生bar,然后另一个引用绑定从bar发生Foo::_bar这里的问题在于,这std::string("Hey")是一个临时对象,当它出现在其中的完整表达式结束时会被销毁。也就是说,在分号之后std::string("Hey")将不存在。

这会导致悬空引用,因为您现在已经Foo::_bar引用了已被销毁的实例。当您打印字符串时,使用悬挂引用会导致未定义的行为

该行Foo foo2(barString)很好,因为barString初始化后存在foo2,所以Foo::_bar仍引用的有效实例std::string由于初始化程序的类型与引用的类型匹配,因此不会创建临时文件。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当此变量已初始化为空字符串时,为什么将其设置为空字符串?

来自分类Dev

为什么在我的代码中不需要将变量设置为空字符串?

来自分类Dev

为什么以反应形式将空字符串设置为null成为空字符串

来自分类Dev

为什么包含空字符串的列表为真?

来自分类Dev

为什么%(Identity)扩展为空字符串?

来自分类Dev

为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

来自分类Dev

在javascript中将字符串变量初始化为null或空字符串有什么区别?首选

来自分类Dev

C# 将字符串变量设置为 SQL 字符串语句的参数

来自分类Dev

为什么EF6 LINQ无法为空字符串变量比较生成正确的“是否为空” SQL?

来自分类Dev

为什么“字符串”-“字符串”为NaN?

来自分类Dev

为什么在web api C#的post方法中将字符串变量的值传递为null

来自分类Dev

使用空字符串在CMake中设置缓存变量有什么意义?

来自分类Dev

为什么 mysqli 将字符串设置为 0?

来自分类Dev

为什么将变量“名称”键入为字符串?

来自分类Dev

在C中声明空字符串变量

来自分类Dev

仅在预检查为空字符串时串联C#字符串

来自分类Dev

为什么在Objective-C中将变量和方法作为字符串传递?

来自分类Dev

为什么在 C++ 中将字符串和 char 连接起来会返回一个空字符串?

来自分类Java

空字符串的模式是什么?

来自分类Java

空字符串的目的是什么?

来自分类Dev

为什么在JavaScript中不空字符串== null

来自分类Dev

为什么搜索空字符串这么快?

来自分类Dev

为什么tcl认为空字符串是double?

来自分类Dev

为什么 glGetProgramInfoLog 返回空字符串?

来自分类Dev

为什么codecs.iterdecode()吃空字符串?

来自分类Dev

为什么返回值总是空字符串?

来自分类Dev

为什么char * foo()返回空字符串?

来自分类Dev

为什么我从 Xpath 得到空字符串

来自分类Dev

为什么字符串类型的默认值是null而不是空字符串?

Related 相关文章

  1. 1

    当此变量已初始化为空字符串时,为什么将其设置为空字符串?

  2. 2

    为什么在我的代码中不需要将变量设置为空字符串?

  3. 3

    为什么以反应形式将空字符串设置为null成为空字符串

  4. 4

    为什么包含空字符串的列表为真?

  5. 5

    为什么%(Identity)扩展为空字符串?

  6. 6

    为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

  7. 7

    在javascript中将字符串变量初始化为null或空字符串有什么区别?首选

  8. 8

    C# 将字符串变量设置为 SQL 字符串语句的参数

  9. 9

    为什么EF6 LINQ无法为空字符串变量比较生成正确的“是否为空” SQL?

  10. 10

    为什么“字符串”-“字符串”为NaN?

  11. 11

    为什么在web api C#的post方法中将字符串变量的值传递为null

  12. 12

    使用空字符串在CMake中设置缓存变量有什么意义?

  13. 13

    为什么 mysqli 将字符串设置为 0?

  14. 14

    为什么将变量“名称”键入为字符串?

  15. 15

    在C中声明空字符串变量

  16. 16

    仅在预检查为空字符串时串联C#字符串

  17. 17

    为什么在Objective-C中将变量和方法作为字符串传递?

  18. 18

    为什么在 C++ 中将字符串和 char 连接起来会返回一个空字符串?

  19. 19

    空字符串的模式是什么?

  20. 20

    空字符串的目的是什么?

  21. 21

    为什么在JavaScript中不空字符串== null

  22. 22

    为什么搜索空字符串这么快?

  23. 23

    为什么tcl认为空字符串是double?

  24. 24

    为什么 glGetProgramInfoLog 返回空字符串?

  25. 25

    为什么codecs.iterdecode()吃空字符串?

  26. 26

    为什么返回值总是空字符串?

  27. 27

    为什么char * foo()返回空字符串?

  28. 28

    为什么我从 Xpath 得到空字符串

  29. 29

    为什么字符串类型的默认值是null而不是空字符串?

热门标签

归档