c++ 哪一行调用默认构造函数?

osh3o9ms  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(124)

咨询的前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"]调用默认构造函数,但为什么呢?
6mzjoqzu

6mzjoqzu1#

正如tkausl在他们的评论中所暗示的,索引操作符需要默认构造函数。
索引运算符的作用是

find tree location for key
if this location does not exist
  create location
  copy-construct key there
  default-construct value there
return reference to value at location

第5步需要默认构造函数,因为所有的东西都需要在编译时解析,所以即使你从来没有真正使用过不存在的键,它也需要默认构造函数。
如果你没有默认的构造函数,你就不能使用索引操作符,使用insertemplacetry_emplace添加元素到map中,然后使用findat查找它们。

相关问题