【问题标题】:Defect report 1207缺陷报告 1207
【发布时间】:2014-11-03 10:18:09
【问题描述】:

我不明白this defect report 1207的原因,更具体的参考下面这句话(重点是我的):

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

编辑

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

【问题讨论】:

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


    【解决方案1】:
    vector v;
    auto end() const -> decltype(v.begin()) { return v.begin(); }
    

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

    在函数体内,考虑了成员函数end() 的常量说明符。 v 的类型是 this->v 的类型 - 这又取决于 this 的 const-ness。

    this'指针是const(因为前面提到的const-specifier),所以成员函数内部this的类型是block const*

    因此,成员函数内部的this->v 的类型是vector const(因为const 访问路径),而v.begin() - 实际上是(this->v).begin() - 调用了返回类型为const-overload是const_iterator。 另一方面,尾部返回类型中的v.begin()“调用”返回iterator 的非常量重载。

    类型不一致就是问题所在。

    【讨论】:

    • On the other hand, v.begin() in the trailing-return-type "calls" the non-const overload that returns iterator. 好的,但是为什么在这种情况下选择了非常量重载?
    • 因为对象参数v(从尾部返回类型看)不是 const 限定的。因此重载决议发现非常量重载是更好的匹配。但从 traling-return-type 看,v 应该是 const 限定的,因为成员函数是。
    • 您的意思是成员函数声明中的const 不适用于尾随返回类型。你能提供一个参考吗?
    • @WakeupBrazil 参考在缺陷报告中给出。它说“因为将成员名称转换为类成员访问表达式(9.3.1 [class.mfct.non-static] 第 3 段)仅发生在非静态成员函数的主体内,因此 v 的类型在尾随返回类型是非常量”
    • 我对类型不一致没有问题。我只是不明白为什么在尾随返回类型中使用v 被推断为非常量。
    【解决方案2】:

    也就是说,当解析尾随返回类型时,成员 v 被查找以充分理解 v.begin() .. 但实际 访问v在调用end() 的情况下,不考虑end()(因此它对v 的访问)是const 的事实。

    【讨论】:

    • 您的回答实际上帮助我更好地理解了它,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多