std::initializer_list的内部实现也是指向一个匿名的数组,为什么不干脆都只用std::array的C风格数组呢? 感觉用两个不同的概念可以表示的东西是同一个。
为什么const_cast不能直接把一个左值变成非const,非得是指针或引用?
为什么const_cast不能直接把一个左值变成非const,非得是指针或引用?
解决方案
16
8
指针和引用也可以是左值。
一个值(左值、右值)经过一个运算符操作,必然会变成另一个值。但两个值可能对应的是同一个对象。(左值、右值是对表达式结果性质的描述,不是对对象的描述)
一个值(左值、右值)经过一个运算符操作,必然会变成另一个值。但两个值可能对应的是同一个对象。(左值、右值是对表达式结果性质的描述,不是对对象的描述)
8
右值有很多种
其中 字面值 如 1,2,3 等 是纯右值
其中 字面值 如 1,2,3 等 是纯右值
8
强制转换获得的是一个新值。
被改变的是表达式的结果,不是构成表达式的对象。
是从表达式的值,获得一个跟他关联的另一个值。
被改变的是表达式的结果,不是构成表达式的对象。
是从表达式的值,获得一个跟他关联的另一个值。
8
std::initializer_list是一个轻量级对象,它指向一个临时常量数组,但不保持该数组,对它进行复制也不会产生内容的复制;
std::array它保持他所持有的数组(里面可以不是常量),对它进行复制会导致内容的复制。它设计用来代替传统的定长数组(保持高效率,与其它容器提供一致的访问界面,且可以解决数组传递退化成指针的问题)。
std::initializer_list看名字也知道,它设计就是用来做初始化列表的,用来给其它容器做间接层,它的实现是编译器特殊支持的,你本人无法实现同样的功能;std::array就是基于正常的语法,你完全可以实现你本人的同样功能的array。
std::array它保持他所持有的数组(里面可以不是常量),对它进行复制会导致内容的复制。它设计用来代替传统的定长数组(保持高效率,与其它容器提供一致的访问界面,且可以解决数组传递退化成指针的问题)。
std::initializer_list看名字也知道,它设计就是用来做初始化列表的,用来给其它容器做间接层,它的实现是编译器特殊支持的,你本人无法实现同样的功能;std::array就是基于正常的语法,你完全可以实现你本人的同样功能的array。