繁体   English   中英

具有成员std :: map的结构的分配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM