gpt4 book ai didi

C++:为什么 gcc 在访问 operator[] 时更喜欢非 const 而不是 const?

转载 作者:可可西里 更新时间:2023-11-01 18:39:48 26 4
gpt4 key购买 nike

一般来说,就 C++ 而言,这个问题可能更合适,但因为我在 linux 上使用 gcc,所以这就是上下文。考虑以下程序:

#include <iostream>
#include <map>
#include <string>

using namespace std;

template <typename TKey, typename TValue>
class Dictionary{
public:
map<TKey, TValue> internal;

TValue & operator[](TKey const & key)
{
cout << "operator[] with key " << key << " called " << endl;
return internal[key];
}

TValue const & operator[](TKey const & key) const
{
cout << "operator[] const with key " << key << " called " << endl;
return internal.at(key);
}

};

int main(int argc, char* argv[])
{
Dictionary<string, string> dict;
dict["1"] = "one";
cout << "first one: " << dict["1"] << endl;

return 0;
}

执行程序时,输出为:

   operator[] with key 1 called 
operator[] with key 1 called
first one: one

我希望编译器在第二次调用时选择 operator[]const 方法。原因是之前没有使用 dict["1"] ,调用 operator[] 导致内部映射创建不存在的数据,即使我唯一想要的是做一些调试输出,这当然是一个致命的应用程序错误。

我正在寻找的行为类似于 C# 索引运算符,它有一个 get 和一个 set 操作,如果 getter 试图访问不存在的东西,你可以在其中抛出异常:

class MyDictionary<TKey, TVal>
{
private Dictionary<TKey, TVal> dict = new Dictionary<TKey, TVal>();
public TVal this[TKey idx]
{
get
{
if(!dict.ContainsKey(idx))
throw KeyNotFoundException("...");

return dict[idx];
}
set
{
dict[idx] = value;
}
}
}

因此,我想知道为什么在不需要非常量访问时 gcc 更喜欢非常量调用而不是 const 调用。

最佳答案

你得不到你想要的效果。当 dict 是非常量时,它会调用 operator[] 的非常量版本。

C# 在这种情况下更胜一筹,因为它可以确定“dict[n]”是否是赋值的一部分。 C++ 无法做到这一点。

关于C++:为什么 gcc 在访问 operator[] 时更喜欢非 const 而不是 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2465533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com