【发布时间】:2021-10-12 08:44:48
【问题描述】:
我有以下最小示例在我的代码中重现错误:
#include <unordered_map>
#include <iostream>
class B
{
public:
B(int b) : m_b{ b } {}
int m_b;
};
int main()
{
using std::cout, std::endl;
std::unordered_map<int, B> ab{};
ab[1] = B(3);
//ab.insert(std::pair<int, B>(1, B(3)));
cout << ab[1].m_b << endl;
}
这会失败并出现一个冗长且笨拙的错误,基本上等于说没有任何参数的B 没有构造函数。错误源于ab[1] = B(3) 为什么需要?为什么使用insert 而不是operator[] 不需要那个构造函数?
为什么我的原始代码中有这行代码:
Vec2 pos{ m_orbits[&p].positionAtTime(m_time + dt) };
还需要一个非参数化的构造函数。我无法在我的最小示例中重现该错误,但m_orbits 是一个无序映射,其中指向Particle 对象的指针作为键,Orbit 对象作为值。 positionAtTime 是Orbit 的const 成员函数,用于计算粒子在特定时间在轨道上的位置。
【问题讨论】:
-
如果没有先创建实例(在左侧),就无法分配(调用 operator=)。
-
当
ab是空地图时,ab[1]应该返回什么? -
ab[1] = B(3)失败,因为unordered_map::operator[]()会在地图中插入一个默认构造的元素(如果不存在)(对于提供的键)。为此,它需要默认为B。返回对映射中相应B的引用(无论是刚刚构建的还是先前存在的)。在ab[1] = B(3)中,引用的B然后被分配B(3)的结果。基于知道右侧是B,以上没有捷径。
标签: c++ algorithm class c++11 stdmap