[英]implicit vs. explicit deleted copy constructor
I've recently experienced some strange behaviour in my C++11 code. 我最近在我的C ++ 11代码中遇到了一些奇怪的行为。
I've got a class, which is only movable: 我有一个班级,只能移动:
class only_move
{
public:
only_move() : value(0) {}
only_move(int value) : value(value) {}
only_move(const only_move&) = delete;
only_move& operator=(const only_move&) = delete;
only_move(only_move&&) = default;
only_move& operator=(only_move&&) = default;
int value;
};
And I've got another class, which contains an only_move
object: 我有另一个类,其中包含一个only_move
对象:
class has_only_move_member
{
public:
has_only_move_member() = delete;
has_only_move_member(only_move&& value) : member(std::move(value)) {}
only_move member;
};
If I understood it correct, that means has_only_move_member
can't be copied, as the only_move
member can't be copied. 如果我的理解是正确的,这意味着has_only_move_member
无法复制,因为only_move
成员不能被复制。 This means has_only_move_member(const has_only_move_member&)
is deleted implicitly. 这意味着隐式删除has_only_move_member(const has_only_move_member&)
。 Let's check that out: 我们来看看:
has_only_move_member object(only_move(5));
has_only_move_member copy_of_object(object);
As expected, it prints out: 正如所料,它打印出:
error: use of deleted function ‘has_only_move_member::has_only_move_member(const has_only_move_member&)’
note: ‘has_only_move_member::has_only_move_member(const has_only_move_member&)’ is implicitly deleted because the default definition would be ill-formed:
class has_only_move_member
Okay, so I moved on and put has_only_move_member
instances in a std::map
. 好的,所以我继续将has_only_move_member
实例放在std::map
。 As they don't have a copy constructor, I've moved them into it: 由于他们没有复制构造函数,我已将它们移入其中:
has_only_move_member object(only_move(5));
std::map<int, has_only_move_member> data;
data.emplace(5, std::move(object));
So far so good. 到现在为止还挺好。 This works like a charm. 这就像一个魅力。
But I had an idea. 但我有个主意。 What about being more explicit and explicitly deleting the copy constructor of has_only_move_member
. 如何更明确地显式删除has_only_move_member
的复制构造has_only_move_member
。 So I wrote into the class has_only_move_member
: 所以我写进了班级has_only_move_member
:
has_only_move_member(const has_only_move_member&) = delete;
After that, the same code from above, there I moved objects into an map gives me an error: 之后,从上面的相同代码,我将对象移动到地图中给了我一个错误:
/usr/include/c++/4.8/bits/stl_pair.h:134:45: error: use of deleted function ‘has_only_move_member::has_only_move_member(const has_only_move_member&)’
Yeah of course it's deleted, but why is there such a gap between implicit and explicit delete? 是的当然它已被删除,但为什么隐式和显式删除之间存在这样的差距?
I'm getting the same behaviour with g++ 4.8.2 and clang 3.4-rc1 on Debian with libstdc++ and recent apple-clang-llvm 4.0 on Mac OS X 10.9 with libc++ 我在使用libcd ++上的g ++ 4.8.2和clang 3.4-rc1以及使用libc ++的Mac OS X 10.9上最近的apple-clang-llvm 4.0获得相同的行为
I already said this in the comment but since this is a correct answer I am reposting as one: 我已在评论中说过这一点,但由于这是一个正确答案,我将其作为一个重新发布:
You added a custom constructor (even though it's a deleted one). 您添加了一个自定义构造函数(即使它是已删除的构造函数)。 Therefore the compiler won't auto generate a move constructor. 因此编译器不会自动生成移动构造函数。 The compiler then falls back to copying which (as you requested) it obviously can't do. 编译器然后回退到复制哪个(按照你的要求)它显然不能做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.