缺陷报告1207

Wak*_*zil 4 c++ language-lawyer c++11

我不明白这个缺陷报告1207的原因,更具体地说是参考下面的句子(重点是我的):

因为将成员名称转换为类成员访问表达式(9.3.1 [class.mfct.non-static]段落3)仅发生在非静态成员函数的主体内部,所以尾随中的v的类型 - return-type是非const,但在返回表达式中是const,导致返回表达式和函数的返回类型之间的类型不匹配.

编辑

也就是说,我不明白为什么尾随返回类型中的v的类型被推断为非const.

Col*_*mbo 9

vector v;
auto end() const -> decltype(v.begin()) { return v.begin(); }
Run Code Online (Sandbox Code Playgroud)

decltype(v.begin()),在尾返回型,是iterator-因为v有类型vector,从外部看到.

但是在函数体内部,end()会考虑成员函数的const-specifier .类型v是 - 的类型this->v- 反过来取决于的常数this.

this'pointee是const(由于前面提到的const-specifier),因此this成员函数内部的类型是block const*.

因此,this->v成员函数内部的类型是vector const(因为const访问路径),并且v.begin()- 实际上(this->v).begin()- 调用const返回类型为的-overload const_iterator.另一方面,v.begin()在trailing-return-type中"调用"返回的非const重载iterator.

那种类型的不一致就是问题所在.


Lig*_*ica 6

它说的是,当拖尾返回类型解析,成员v中查找到足够使的感觉v.begin()..但实际访问v在已经调用的情况下end()不考虑,所以既不是事实,end()(因此它的访问权限vconst.