代码之家  ›  专栏  ›  技术社区  ›  Daniel Langr

引用/指针的无效具体是什么?

  •  5
  • Daniel Langr  · 技术社区  · 7 年前

    我找不到任何定义 指针/引用无效 在标准中。我问,因为我刚刚发现C++ 11禁止字符串复制(COW)。据我所知,如果使用奶牛,那么 p 仍然是有效指针,并且 r 以下命令后的有效引用:

    std::string s("abc");
    std::string s2(s);
    char * p = &(s2[0]);
    char & r = s2[0];
    s2[1] = "B";
    

    只是他们不再指向/引用 s2 但只限于 s .

    在C++ 11标准中,可以说非常量。 std::basic_string::operator[] 不能使指向字符串元素的指针/引用(以及迭代器)无效。

    哪些规则说明上面的示例实际上会失效 R 是否实施了COW?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Lightness Races in Orbit    7 年前

    本标准中没有“无效”的定义,因为该术语是从英语继承而来的。它的英文意思是:无效的引用/指针不再有效。不能使用。

    然而,也有一些地方明确指出了这个约束。例如,当将指针左值转换为右值(在表达式计算期间发生)时:

    [conv.lval/2] 否则,如果glvalue引用的对象包含无效的指针值(3.7.4.2、3.7.4.3),则将定义该行为的实现

    我现在找不到引用的措辞,但无论如何,你不能用引用来引用已经不存在的东西,这是不言而喻的。

        2
  •  0
  •   user7860670    7 年前

    例如:

    std::string * p_s(new ::std::string("abc"));
    std::string s2(*p_s); // shares buffer with p_s
    char const & ch1(static_cast<::std::string const &>(*p_s)[0]);
    char const & ch2(static_cast<::std::string const &>(s2)[0]); // same as ch1
    // CoW, ch2 becomes invalid, but is backed by p_s buffer
    char & ch(static_cast<::std::string &>(s2)[0]); // backed by new buffer
    // both ch1 and ch2 become invalid
    delete p_s;