代码之家  ›  专栏  ›  技术社区  ›  sbi

指内置类型的文本

  •  3
  • sbi  · 技术社区  · 6 年前

    因此,我们在Linux上遇到了一个失败的测试,我想这是因为我对引用内置文本的指针的有效性的错误假设。代码类似于以下伪代码:

    auto obj = func( 'c', "str" ); // (1)
    big_type big_object;           // (2) 
    

    在(1)处, func() 返回存储 const

    在(2)处,调试显示以前是 'c' const char* 在里面 obj

    Tets表明,这种情况也发生在 int double

    然而,尽管我知道,如果这只涉及小型内置类型的文本,我可以解决这个问题(通过复制它们而不是引用它们),如果这可能发生在任意大小的对象上( "str" )还有,我们有一个相当大的问题。

    4 回复  |  直到 6 年前
        1
  •  4
  •   Quentin    6 年前

    从[ expr.prim.literal§1 ]:

    A 是主表达式。它的类型取决于它的形式。字符串文字是 左值

    关于这些左值的更多精确性可以在[ lex.string§16

    评估 串文字 结果是字符串文本对象

    它直接解决了这个问题:字符串文本是唯一具有静态存储持续时间的文本,因此可以由比它们出现的表达式更久的指针引用。

        2
  •  2
  •   Some programmer dude    6 年前

    func 定义如下:

    some_class_type func(const char& ch, const char* str)
    {
        some_class_type some_object;
        some_object.pch = &ch;
        some_object.pstr = str;
        return some_object;
    }
    

    &ch .

    人的一生 ch func('c', "str") ),则临时变量将不复存在,剩下的指针将丢失。

    对于单个字符,如单整数或浮点值,几乎不需要使用指向它们的指针。存储值。

        3
  •  1
  •   John Zwinck    6 年前

        4
  •  1
  •   Useless    6 年前

    对于确切的规则,它可能是足够的(虽然昆廷的标准引用显然是更权威的)指出下面的句子 string literals

    这对任何一个 other types of literal

    另一种方法是重新检查代码

    object func(char c, const char *s)
    {
        return object{&c, s};
    }