C++ C++;:在什么情况下将使用哪个运算符[]?

C++ C++;:在什么情况下将使用哪个运算符[]?,c++,operator-overloading,constants,C++,Operator Overloading,Constants,我有一个带有这些运算符的struct(给定一些类型T): 当我通过[I]访问此对象的非常量对象时,它是否始终使用非常量运算符[],或者它是否会自动查看需要哪一个(例如,如果常量版本“足够”)并使用该对象?有什么规定?大多数编译器(我最关心的是Clang、最新的GCC和最新的MSVC)在那里的表现是否相同 背景:write(i)可能比get(i)成本更高。我甚至有一些行为略有不同的代码,write(I)可能会触及一些文件、设置一些修改的标志或其他任何东西。与任何成员函数一样,重载的选择取决于隐式实

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

当我通过
[I]
访问此对象的非常量对象时,它是否始终使用非常量
运算符[]
,或者它是否会自动查看需要哪一个(例如,如果常量版本“足够”)并使用该对象?有什么规定?大多数编译器(我最关心的是Clang、最新的GCC和最新的MSVC)在那里的表现是否相同


背景:
write(i)
可能比
get(i)
成本更高。我甚至有一些行为略有不同的代码,
write(I)
可能会触及一些文件、设置一些修改的标志或其他任何东西。

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

T x;

x.foo();                        // #1
const_cast<T const &>(x).foo(); // #2
tx;
x、 foo();//#1.
const_cast(x).foo();//#2.
在案例#1中,隐式实例参数的类型为
T
,因此重载
T::foo()
是可行的,将被选中。在第2种情况下,隐式实例参数的类型为
T const
,因此只有重载
T::foo()const
是可行的,如果它存在,将被选中


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

如果有非常量对象,它将始终使用非常量重载

如果要手动控制,请使用
const\u cast
。。。尽管如此,如果这些方法有不同的行为,并且您希望清楚地知道您在做什么,那么最好调用一个命名方法

T x;

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