Map::operator[] 总是需要一个默认的构造函数[重复]
Posted
技术标签:
【中文标题】Map::operator[] 总是需要一个默认的构造函数[重复]【英文标题】:Map::operator[] always requires a default constructor [duplicate] 【发布时间】:2021-01-11 09:13:46 【问题描述】:#include <iostream>
#include <string>
#include <map>
using namespace std;
class x
public:
string s;
//x()cout<<"default"<<endl;
x(string s=""):s(s)cout<<"mine"<<endl;
;
int main()
map<int,x> m;
m.insert(pair<int,x>(1,x("me")));
cout<<m[1].s<<endl;
我知道当元素不存在时 map::operator[] 需要默认 cst,但是
m[1] 在没有默认 cst 的情况下为苹果 clang 中的 x 类给出错误,即使 m[1] 的元素已经存在。为什么?
【问题讨论】:
这就是静态检查的工作原理。 编译器如何知道现有元素? 使用at
: m.at(1).s
不需要默认ctor
为了在编译时确定对象存在,编译器需要执行程序,但不先编译就不可能执行程序。
@fas 是 map::at c++11 的特性吗?
【参考方案1】:
我了解 map::operator[] 在元素不存在时需要默认 cst,[...]
这不太正确。
map::operator[]
始终需要默认构造函数,因为该元素可能不存在。它是否真的存在并不重要,因为map<T>
是否有operator[]
已经在编译时决定了。
【讨论】:
以上是关于Map::operator[] 总是需要一个默认的构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
std::unordered_map::operator[] - 为啥有两个签名?
如何将 std::map::operator= 与初始值设定项列表一起使用
如果键不存在,为啥 std::map operator[] 会创建一个对象?
获取对 unordered_map operator[] 返回值的引用