【问题标题】:Why Can't Make a Reference To Pointer for Constant Assign a String Literal为什么不能引用指针以用于常量分配字符串文字
【发布时间】:2020-10-12 08:31:24
【问题描述】:

我可以让指针指向字符串字面量,它会将字符串字面量转换为常量指针,但是指针的引用不能分配字符串字面量,例如:

 const char *&text = "Hello, World\n"; 

出现错误,编译器说我不能将数组强制转换为指针引用,我很好奇,为什么不正确?

【问题讨论】:

    标签: c++ pointers reference constants const-pointer


    【解决方案1】:

    这是不正确的,因为字符串文字不是指针。它是一个数组。文字确实隐式转换为指向数组第一个元素的指针(就像所有数组一样),但转换的结果是一个右值。并且对非常量的左值引用不能绑定到右值。

    根本没有理由这么写。添加不必要的间接性没有任何好处。 const char* text = "Hello, World\n"; 更简单、更正确。

    【讨论】:

      【解决方案2】:

      编译器告诉你的是你需要一个常量指针。

      您的构造是对指向 const char 的指针的引用,因此该指针也必须是常量。

      您不能将临时值绑定到非常量引用,除非它也是 const。

      const char *const &text = "Hello, World\n";
      

      你甚至可以这样做:

      char* const& text = "Hello, World\n";
      

      它可能会在大多数编译器中编译,但出于明显的安全原因,C++ 标准不允许非 const 指针指向字符串文字。

      【讨论】:

        【解决方案3】:

        转换为const char* 可以看作是临时按值返回。您不能将引用绑定到非const 临时对象。要延长临时对象的寿命,您也必须创建指针 const。如果这不是一个选项,您必须将引用绑定到一个 不是 临时的指针。

        例子:

        #include <iostream>
        
        int main() {
            const char* foo = "foo\n";
            const char* bar = "bar\n";
            const char*& text = foo;
            
            std::cout << text;
            foo = bar;
            std::cout << text;
        }
        
        foo
        bar
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-02
          • 1970-01-01
          • 2018-03-26
          • 1970-01-01
          • 2011-10-11
          • 1970-01-01
          • 2021-11-21
          • 1970-01-01
          相关资源
          最近更新 更多