gpt4 book ai didi

c++ - 不需要默认构造函数时 map operator[] 的安全性

转载 作者:行者123 更新时间:2023-11-28 00:29:24 38 4
gpt4 key购买 nike

我最近在工作中遇到了一个有趣的程序错误。我想进一步了解 operator[] 如何处理 map 。考虑以下示例代码:

#include <map>
#include <iostream>
#include <utility>
#include <tuple>

class test
{
public:
test(int a, char b) {
a_ = a;
b_ = b;
}

void print() {
std::cout << a_ << " " << b_ << std::endl;
}

private:
int a_;
char b_;
};


int main()
{
std::map<int, test> mapper;
mapper.emplace(std::piecewise_construct,
std::forward_as_tuple<int>(1),
std::forward_as_tuple<int, char, double>(1, 'c', 2.34));
mapper[1].print();
}

代码很简单,目标很明确,我不想为类测试设置默认构造函数。但是,此代码不会编译,因为 mapper[1].print() 调用默认构造函数。

此处显而易见的解决方案是将 mapper[1].print() 替换为 mapper.find(1)->second.print()。我只是对为什么 mapper[1] 需要创建一个 test 感兴趣。这是否意味着每次在我使用 operator[] 使用映射编写的任何代码中,它都会创建一个默认值并在调用其函数之前复制该类?

这似乎是一个巨大的时间浪费,我理解它在这样的事情中的必要性:mapper[2] = test(1, 'a')。有没有什么办法可以告诉它它不是 operator= 调用的一部分?我猜不会。

最佳答案

来自 Visual Studio 2012 库

mapped_type& operator[](key_type&& _Keyval)
{ // find element matching _Keyval or insert with default mapped
iterator _Where = this->lower_bound(_Keyval);
if (_Where == this->end()
|| this->_Getcomp()(_Keyval, this->_Key(_Where._Mynode())))
_Where = this->insert(_Where,
pair<key_type, mapped_type>(
_STD move(_Keyval),
mapped_type())); // <---- call to default constructor
return (_Where->second);
}

如您所见,它要求 mapped_type 是默认可解释的编译并不意味着每次调用 operator[] 时都需要构造对象

关于c++ - 不需要默认构造函数时 map operator[] 的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484897/

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