在 C++ 中初始化引用不起作用,但初始化 const 引用有效,为什么?
initializing references in c++ doesn't work but initializing const references works, why?
const string& s = "rajat";
工作时
string& s = "rajat";
不。为什么?
"rajat"
不是std::string
,它是一个以零结尾的六个char
数组,即 char[6]
你可以从一个以 null 结尾的 char
数组构造一个std::string
,这就是你编写时发生的情况:
std::string s = "rajat";
当你想要初始化一个string&
你必须有一个string
来绑定引用,所以编译器试图从char
数组构造一个string
并将引用绑定到该数组,即
std::string& s = std::string("rajat");
但是,这是非法的,因为构造的string
是临时对象,非常量引用无法绑定到临时对象,请参阅为什么非常量引用不能绑定到临时对象?
这将隐式构造一个临时string
从 RHS 上的字符串文字。然后将临时绑定到引用:
const string& s = "rajat";
// ^^^^^ temporary string is constructed from "rajat" literal
该语言只允许const
引用绑定到临时,所以这
string& s = "rajat";
是非法的,因为它试图将非常量引用绑定到临时string
。
请参阅此相关的GotW帖子,其中也涉及终身问题。
相关文章:
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖