13赞
766
当前位置:  开发笔记 > 编程语言 > 正文

移动构造函数行为

如何解决《移动构造函数行为》经验,有好办法吗?

我最近从移动构造函数中偶然发现了一些奇怪的行为(从我的观点来看很奇怪).使用GCC和Visual Studio进行编译时,结果会有所不同.我想听听这种行为的解释,不要认为这是一个bug,但可能是特定于编译器的.

请考虑以下代码:

#include 
#include 

struct Test
{
    std::unordered_map v;
    std::unordered_map::iterator vend;

    Test(std::unordered_map::iterator &it)
        : vend { v.end() }
    {
        it = this->vend;
    };

    Test() = delete;
    Test(Test const &) = delete;
    Test(Test &&) = default; // <- line in question
};

int main()
{
    std::unordered_map::iterator it;
    std::unordered_map m;
    m.emplace(0, Test{ it });
    std::cout <

所以我在创建元素时将迭代器存储到map元素中的map的末尾.我也参考了它以便稍后进行比较.来自std :: unordered_map :: emplace:

如果容器中没有带键的元素,则使用给定的args将新元素插入到就地构造的容器中.

小心使用emplace可以构建新元素,同时避免不必要的复制或移动操作.

使用默认移动构造函数,存储在map元素中的迭代器和我的引用是相同的:

Test(Test &&) = default; 

结果是true在GCC和true在VS. 现在,如果我将移动构造函数更改为:

Test(Test &&) {} 

海湾合作委员会仍然返回 true但VS返回false

以防万一尝试使用c ++ 17,结果相同.那么有人可以解释一下这里发生了什么吗?

推荐阅读
devbox
le__citron
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4