【问题标题】:C++: which operator[] will be used in what case?C ++:在什么情况下将使用哪个运算符[]?
【发布时间】:2012-03-09 23:00:12
【问题描述】:

我有一个带有这些运算符的struct(给定一些类型T):

T& operator[](size_t i) { return write(i); }
const T& operator[](size_t i) const { return get(i); }

当我通过 [i] 访问 this 的非常量对象时,它会始终使用非常量 operator[] 还是会自动查看需要哪个对象(例如,如果 const-version 是“足够的”)拿那个?那里有什么规则?大多数编译器(我主要关心 Clang、最近的 GCC 和最近的 MSVC)在那里的行为是否相同?

背景:write(i) 的成本可能比get(i) 高得多。我什至有一些行为略有不同的代码,write(i) 可能会触及一些文件,设置一些修改标志或其他什么。

【问题讨论】:

    标签: c++ operator-overloading constants


    【解决方案1】:

    与任何成员函数一样,重载的选择取决于隐式实例参数的类型:

    T x;
    
    x.foo();                        // #1
    const_cast<T const &>(x).foo(); // #2
    

    在情况#1 中,隐式实例参数的类型为T,因此重载T::foo() 是可行的并且将被选中。在情况 #2 中,隐式实例参数的类型为 T const,因此只有重载 T::foo() const 是可行的,如果存在就会被选中。

    正常的重载解决规则在这里起作用:如果您同时具有 const 和非常量重载并且实例参数是非常量,则选择非常量版本,因为它需要零转换,而 const 重载将需要一次(标准)转换,即从T &amp;T const &amp;,因此重载不如非常量转换。

    【讨论】:

      【解决方案2】:

      如果你有一个非常量对象,它将总是使用非常量重载。

      如果你想手动控制它,请使用const_cast ...虽然,如果方法有不同的行为并且你想清楚你在做什么,最好调用一个命名的方法 代替。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 2021-01-31
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多