- 主题:关于auto去引用这个特性的一个疑问?
使用auto定义一个变量他有个一个特性,就是初始变量如果是引用类型,他会把这个属性去掉:
int a =1;
int &b = a;
auto c = b;//c是int型,去除引用
那这个时候是不是就相当于值拷贝?
那么问题来了,在《Effective Modern C++》条款6中说,
std::vector<bool> features(const Widget& w);
...
Widget w;
…
auto highPriority = features(w)[5]; // w是不是个高优先级的?
…
processWidget(w, highPriority);
在这里highPriority得到的是std::vector<bool>内部的一个引用类对象std::vector<bool>::referenc,是一个临时变量的引用,会引发highPriority的行为不确定,
这里为什么没有去引用而得到的是一份内部对象的拷贝?
Scott Meyers不会说错,但是这个知识点没想明白
--
FROM 115.171.170.*
【 在 xunery 的大作中提到: 】
: 使用auto定义一个变量他有个一个特性,就是初始变量如果是引用类型,他会把这个属性去掉:
: int a =1;
: int &b = a;
: ...................
说的是两回事
std::vector<bool>::reference是一个类,这个类里可能包含了指向一个内部结构的指针
std::vector<bool>::reference 并不是 C++ 概念里的 reference
--
FROM 111.206.145.*
ok,理解错他说的返回引用的含义了,谢谢
【 在 leslin 的大作中提到: 】
:
: 说的是两回事
: std::vector<bool>::reference是一个类,这个类里可能包含了指向一个内部结构的指针
: ...................
--
FROM 115.171.170.*
"std::vector<bool>::referenc,是一个临时变量的引用"
书里限定了考虑一种【特定实现】,std::vector<bool>::reference obj; obj里是指针,指向什么呢?
指向 vector<bool> 的内存block. machine word. 因为 feature[w]返回的是右值,那行结束就析构了,
所以内存block不存在了, obj里的指针,就是dangle pointer.
如果不是这么特殊的实现,auto& = funReturnVectorT()[5]; 可以延长右值的生命周期。
归根结底还是vector<bool>太特殊了。好像Effective里,就有不要用vector<bool>的建议。
【 在 xunery 的大作中提到: 】
: 使用auto定义一个变量他有个一个特性,就是初始变量如果是引用类型,他会把这个属性去掉:
: int a =1;
: int &b = a;
: ...................
--
修改:DoorWay FROM 43.224.212.*
FROM 43.224.212.*
求证了下:
printf("%lu %lu %d\n", sizeof(highPriority), sizeof(void*), highPriority);
warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has
type ‘std::_Bit_reference’ [-Wformat=]
16 8 10865696
在STL(某个实现)的源码里:
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc> {
typedef typename _Alloc_traits::reference reference;
StackOverflow('typeid' versus 'typeof' in C++). C++ language has no such thing as typeof. If you are talking about GCC's typeof, then a similar feature is present in C++11 through the keyword decltype.
--
修改:billybear04 FROM 106.121.10.*
FROM 106.121.10.*