[英]Assignment of a structure that has a member std::map
在下面的这段代码中,我将std::map
放在一个结构中。 然后,我只是将结构实例分配给其他实例。 请注意,该结构没有赋值运算符。 在这种情况下,我是否应该期望map的赋值运算符会被调用,或者编译器只是浅拷贝包含结构的内存?
int _tmain(int argc, _TCHAR* argv[])
{
struct vectstruct
{
std::map<int, double> mymap;
};
vectstruct vs1, vs2;
vs1.mymap[7] = 54.321;
vs2 = vs1; // Should call assignment operator of map vs2.mymap
vs1.mymap[7] = 65.432;
return 0;
}
我使用Microsft Visual Studio进行了尝试,在程序结束时,我看到vs2.mymap[7]
值仍为54.321
。 但是我想知道C ++标准是否正确,还是我需要编写vectstruct
赋值运算符, vectstruct
其中明确调用了map的赋值运算符?
作为样式,您应该在main
之外声明和定义类型。
就是说,如果您不提供副本分配运算符,则编译器将为您隐式创建一个*,而隐式副本将仅执行按元素的副本分配。 在这种情况下,隐式代码将类似于:
vectstruct& operator=(const vectstruct& rhs) {
mymap = rhs.mymap;
return *this;
}
对于std::map
,赋值会执行完整复制,因此不会引用,因此在代码结尾时,您应该期望:
vs2.mymap[7] == 54.321 // to the extent that equality of doubles is a thing
vs1.mymap[7] == 65.432
*在某些情况下,编译器无法创建隐式赋值运算符,该运算符基本上可以归结为具有不可复制成员的对象。 例如,引用或unique_ptr
。
默认的operator=
将执行您期望的逐成员复制。 即 它将为结构的每个数据成员调用operator=
。 而std::map
则实现operator=
,因此一切都将像charm一样工作。 无需自己编写相同的运算符来膨胀代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.