我不理解this defect report 1207的原因,更具体地说是参考下面的句子(重点是我的):
因为将成员名称转换为类成员访问权限 表达式(9.3.1 [class.mfct.non-static]第3段)仅发生 在非静态成员函数体内,中的v的类型 trailing-return-type是非const ,但在返回中是const 表达式,导致返回表达式之间的类型不匹配 和函数的返回类型。
修改
也就是说,我不明白为什么尾随返回类型中的v类型被推断为非const。
答案 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}}。