由于字符串文字被视为左值,为什么绑定左值引用必须是const?

埃劳

我知道已经有一些与此主题类似的主题(例如this)。

本主题中给出的示例是这样的:

std::string & rs1 = std::string();

显然,std :: string()是一个右值。但是,我的问题是为什么s1合法而s2不合法?

const std::string& s1 = "String literal";
std::string& s2 = "String literal";

该标准明确指出字符串文字是左值(这是可以理解的,因为从技术上讲,它们是幕后的const char *)。当我编译s2时,得到以下信息:

prog.cpp:4:19: error: invalid initialization of non-const reference of type
'std::string& {aka std::basic_string<char>&}' from an rvalue of type
'const char*' std::string& s2 = "String literal";

我知道左值和右值的标准定义是互斥的,因此这可能是编译器的错误吗?在此示例中,我使用的是gcc 4.9.2。这也是文字确实是xvalue的情况之一吗?

哥伦布

问题是字符串文字不是类型std::string或其子类,而是类型
char const[N]因此,初始化程序的类型与引用的目标类型与引用不兼容,因此必须创建一个临时并将其绑定到引用。

但是,临时对象不能绑定到非常量左值引用。即您的情况相当于

std::string& s = std::string("Abcdefg");

即使根据您的说法,这显然也是错误的。


实际上,它不起作用的确切原因不是因为临时对象不能绑定到非常量左值引用,而是非常量左值引用的初始化程序受到某些char const[N]无法满足的要求,在这种情况下[dcl。 init.ref] / 5:

参考输入“ CV1 T1 ”是通过类型“的表达初始化CV2 T2 ”如下:

  • 如果引用是左值引用和初始值设定项表达式

    • 是左值(但不是位字段),以及“ CV1 T1 ”是参考兼容“ CV2 T2 ”或
    • 具有类类型(即T2是类类型),其中T1与T2无关,并且可以隐式转换为类型为“ cv3 T3”的左值,其中“ cv1 T1 ”与“ cv3 引用兼容” T3106(通过枚举适用的转换函数(13.3.1.6)并通过过载分辨率选择最佳的转换函数(13.3)来选择此转换),

    然后,在第一种情况下将引用绑定到初始化程序表达式左值,在第二种情况下将引用绑定到转换的左值结果(或者在两种情况下都绑定到对象的适当基类子对象)。

  • 否则,该引用应为对非易失性const类型的左值引用(即cv1为const),或者该引用应为右值引用。

    • [..]

106)这需要返回参考类型的转换函数(12.3.2)。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么字符串不显示左操作数所需的错误左值?

来自分类Dev

为什么(var)被视为左值?

来自分类Dev

左值引用绑定

来自分类Dev

为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

来自分类Dev

为什么C ++左值对象不能绑定到右值引用(&&)?

来自分类Dev

返回const左值引用到右值临时?为什么这样做?

来自分类Dev

左值到右值引用绑定

来自分类Dev

左值到右值引用绑定

来自分类Dev

错误:表达式必须是使用字符串的可修改左值

来自分类Dev

引用非const的C ++初始值必须为左值

来自分类Dev

以函数为参数的C ++错误,对非const的引用的初始值必须为左值

来自分类Dev

对指针错误的引用:非常量左值引用“ const * FooBarClass”无法绑定到临时对象

来自分类Dev

为什么将空字符串文字视为true?

来自分类Dev

为什么将对象键的第一个值视为字符串-AngularJs

来自分类Dev

为什么右值引用作为左值引用传递?

来自分类Dev

为什么标准允许左值引用元组分配右值引用元组?

来自分类Dev

为什么重载的移动赋值运算符返回左值引用而不是右值引用?

来自分类Dev

返回语句将右值引用绑定到左值?

来自分类Dev

将右值绑定到左值引用

来自分类Dev

为什么std :: move复制右值或const左值函数参数的内容?

来自分类Dev

为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

来自分类Dev

为什么将表达式强制转换为右值,对函数的引用是左值?

来自分类Dev

为什么不能使用右值来初始化左值引用?

来自分类Dev

字符串和整数对象或左值/右值的内存位置

来自分类Dev

通过左值引用修改右值的行为是什么?

来自分类Dev

将返回类型专门用于void或const左值引用

来自分类Dev

右值参考被视为左值?

来自分类Dev

为什么在引用文字时必须使用const引用

来自分类Dev

为什么此函数在给定右值参数的情况下返回左值引用?

Related 相关文章

  1. 1

    为什么字符串不显示左操作数所需的错误左值?

  2. 2

    为什么(var)被视为左值?

  3. 3

    左值引用绑定

  4. 4

    为什么可以将右值间接绑定到左值引用,而不能直接绑定呢?

  5. 5

    为什么C ++左值对象不能绑定到右值引用(&&)?

  6. 6

    返回const左值引用到右值临时?为什么这样做?

  7. 7

    左值到右值引用绑定

  8. 8

    左值到右值引用绑定

  9. 9

    错误:表达式必须是使用字符串的可修改左值

  10. 10

    引用非const的C ++初始值必须为左值

  11. 11

    以函数为参数的C ++错误,对非const的引用的初始值必须为左值

  12. 12

    对指针错误的引用:非常量左值引用“ const * FooBarClass”无法绑定到临时对象

  13. 13

    为什么将空字符串文字视为true?

  14. 14

    为什么将对象键的第一个值视为字符串-AngularJs

  15. 15

    为什么右值引用作为左值引用传递?

  16. 16

    为什么标准允许左值引用元组分配右值引用元组?

  17. 17

    为什么重载的移动赋值运算符返回左值引用而不是右值引用?

  18. 18

    返回语句将右值引用绑定到左值?

  19. 19

    将右值绑定到左值引用

  20. 20

    为什么std :: move复制右值或const左值函数参数的内容?

  21. 21

    为什么此代码给出错误“无法将类型'char *&'的非常量左值引用绑定到类型为'char *'的右值”

  22. 22

    为什么将表达式强制转换为右值,对函数的引用是左值?

  23. 23

    为什么不能使用右值来初始化左值引用?

  24. 24

    字符串和整数对象或左值/右值的内存位置

  25. 25

    通过左值引用修改右值的行为是什么?

  26. 26

    将返回类型专门用于void或const左值引用

  27. 27

    右值参考被视为左值?

  28. 28

    为什么在引用文字时必须使用const引用

  29. 29

    为什么此函数在给定右值参数的情况下返回左值引用?

热门标签

归档