缺陷报告1207

时间:2014-09-09 21:44:49

标签: c++ c++11 language-lawyer

我不理解this defect report 1207的原因,更具体地说是参考下面的句子(重点是我的):

  

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

修改

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

2 个答案:

答案 0 :(得分:9)

vector v;
auto end() const -> decltype(v.begin()) { return v.begin(); }
尾随返回类型中的

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 - 返回类型为const_iterator的重载。 另一方面,trailing-return-type中的v.begin()“调用”返回iterator的非const重载。

这种类型不一致就是问题。

答案 1 :(得分:6)

它说,当解析trailing-return-type时,查找成员v以充分理解v.begin() ..但实际的访问权限不考虑在调用v的情况下end(),因此end()(因此对v的访问权限){const的事实也不是{{1}} {1}}。