c – 后备复制构造函数不工作?
我认为当我删除B中的移动构造函数时,下面的代码仍然可以正常编译,因为它仍然需要复制构造函数来构造B对象.为什么编译器现在抱怨.没有= delete它没有并且无论如何都调用了复制构造函数,因为它不允许提供默认的移动构造函数!)
class B{ public: B(){} ~B(){} B & operator=(const B & b){ std::cout << " cannot move -> copy " << std::endl; return *this; } B(const B & v){ std::cout << " cannot move -> copy " << std::endl; } // B(B && b) = delete; // uncomment this! }; int main() { B b( B{} ); } 编译器输出与clang 3.6(Live code) main.cpp:27:7: error: call to deleted constructor of 'B' B b( B{} ); ^ ~~~ main.cpp:21:5: note: 'B' has been explicitly marked deleted here B(B && b) = delete; ^ 1 error generated. 解决方法
仍然声明具有已删除定义的函数.除此之外,它通常会参与重载决策 – 但如果重载决议实际上选择它,则程序格式不正确([dcl.fct.def.delete] / 2):
这与从未声明过的函数不同.当然,不存在的声明不参与重载决策. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |