参见英文答案 >
What’s the exact semantics of a deleted function in C++11?2
做了一些研究后,我看到 C++11 has a defect与分配器需要类型是可移动/可复制的.我确信这是这个问题的原因,但是我对被删除和未声明的移动语义之间的行为感到困惑.
做了一些研究后,我看到 C++11 has a defect与分配器需要类型是可移动/可复制的.我确信这是这个问题的原因,但是我对被删除和未声明的移动语义之间的行为感到困惑.
#include <vector> class copyable { public: copyable() = default; copyable(copyable const& other) : m_int(other.m_int) {} copyable& operator= (copyable const& other) { m_int = other.m_int; return *this; } copyable(copyable&&) = delete; copyable& operator= (copyable&&) = delete; private: int m_int = 100; }; int main() { std::vector<copyable> objects; objects.push_back(copyable{}); }
这无法在MSVC上编译:
xmemory0(600): error C2280: ‘copyable::copyable(copyable &&)’ : attempting to reference a deleted function
和Cl(live sample):
new_allocator.h:120:23: error: call to deleted constructor of ‘copyable’
在这两种情况下,当我删除显式删除的移动构造/分配方法时,代码编译. AFAIK当你声明复制分配/构造方法时,编译器不会隐式声明相应的移动成员.所以他们还应该被有效地删除,对吧?为什么我删除显式删除移动构造/赋值时代码编译?
这个C11缺陷的一般解决方法是什么?我不希望我的对象是可移动的(但它们是可复制的).
解决方法
删除功能与不声明功能不同.
已删除的函数被声明并参与重载解析,但是如果您尝试调用它,就会产生错误.
如果您无法声明您的移动构造函数,编译器将不会在创建一个复制构造函数时创建一个.在rvalue上的重载分辨率会找到你的拷贝构造函数,这可能是你想要的.
你用foo(foo&&)= delete表示的是“如果有人试图移动构造这个对象,生成一个错误”.
我可以说明这里的区别:
void do_stuff( int x ) { std::cout << x << "\n"; } void do_stuff( double ) = delete; void do_stuff2( int x ) { std::cout << x << "\n"; } //void do_stuff2( double ) = delete; int main() { do_stuff(3); // works //do_stuff(3.14); // fails to compile do_stuff2(3); // works do_stuff2(3.14); // works,calls do_stuff2(int) }
原文地址:https://www.jb51.cc/c/113632.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。