gpt4 book ai didi

c++ - 编译器是否优化了默认移动构造函数?

转载 作者:太空狗 更新时间:2023-10-29 21:13:31 25 4
gpt4 key购买 nike

我有一个 std::multimap以下类型:

 typedef std::multimap<std::pair<bool,uint32_t>, FooObject>

FooObject 声明了默认的移动复制和赋值构造函数:

   FooObject(FooObject&& v) = default;
FooObject& operator=(FooObject&& other)=default;

复制/赋值构造函数是私有(private)的,以禁用隐式复制。

所以我应该能够像这样在 map 中放置一对:

mymap.emplace(std::make_pair(false,32),FooObject());

这会抛出一个错误列表,其中一个在最后:

error C2660: 'std::pair::pair': function does not take 2 arguments

如果我在没有“默认”的情况下声明移动复制分配构造函数然后就可以编译了。

   FooObject(FooObject&& v){}
FooObject& operator=(FooObject&& other){}

这是为什么呢?当标记为“default”关键字时,编译器是否优化掉了这些构造函数?我正在使用 MSVC140

更新:

根据下面的评论,我找到了原因——FooObject 有一个不可复制的成员实例。这是 FooObject:

#define NO_COPY_ASSIGN(TypeName)   \                                                     
TypeName (const TypeName &); \
void operator= (const TypeName &);

class FooObject
{
private:
NO_COPY_ASSIGN(FooObject)
public:
struct FooStruct
{
FooBuffer frameBuffer; //<--Here it is
}fooStruct;

FooObject(){}


/** Move constructor to allow insert into vector without copy */
FooObject(FooObject&& v) = default;
FooObject& operator=(FooObject&& other) = default;

};

*FooBuffer 也有其私有(private)的复制/分配。但我仍然不明白为什么用 {} 替换“默认”可以解决这个问题。请解释一下。

最佳答案

你的问题是FooObject的成员之一不可移动,这会阻止编译器生成默认移动操作。

{}您自己实现的移动操作的版本FooObject 的成员不起作用(特别是:它们实际上不执行移动操作)因此是合法的。

关于c++ - 编译器是否优化了默认移动构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44030635/

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