咨询的前SO职位:Default Constructor Calls
下面是代码:
#include <iostream>
#include <unordered_map>
using namespace std;
struct item {
std::string name;
int price;
// item() = default;
item(std::string n, int p): name(n), price(p) {}
};
void createItems(std::unordered_map<std::string, item>& blah);
int main()
{
std::unordered_map<std::string, item> blah;
createItems(blah);
cout << blah["armor"].name << " " << blah["armor"].price << std::endl;
return 0;
}
void createItems(std::unordered_map<std::string, item>& blah) {
item i1{"armor", 1000};
item i2{"amulet", 200};
blah["armor"] = i1;
blah["amulet"] = i2;
return;
}
运行时的错误消息:
main.cpp:20:25: required from here
/usr/include/c++/11/tuple:1824:9: error: no matching function for call to ‘item::item()’
1824 | second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:10:5: note: candidate: ‘item::item(std::string, int)’
10 | item(std::string n, int p): name(n), price(p) {}
| ^~~~
main.cpp:10:5: note: candidate expects 2 arguments, 0 provided
main.cpp:6:8: note: candidate: ‘item::item(const item&)’
6 | struct item {
| ^~~~
main.cpp:6:8: note: candidate expects 1 argument, 0 provided
main.cpp:6:8: note: candidate: ‘item::item(item&&)’
main.cpp:6:8: note: candidate expects 1 argument, 0 provided
据我所知,调用了默认构造函数,但由于我注解掉了该行,因此调用会导致错误。
- 问题**:为什么(以及在哪里)需要默认构造函数?我怀疑
blah["armor"]
调用默认构造函数,但为什么呢?
- 问题**:为什么(以及在哪里)需要默认构造函数?我怀疑
1条答案
按热度按时间6mzjoqzu1#
正如tkausl在他们的评论中所暗示的,索引操作符需要默认构造函数。
索引运算符的作用是
第5步需要默认构造函数,因为所有的东西都需要在编译时解析,所以即使你从来没有真正使用过不存在的键,它也需要默认构造函数。
如果你没有默认的构造函数,你就不能使用索引操作符,使用
insert
,emplace
或try_emplace
添加元素到map中,然后使用find
或at
查找它们。