我的课不好听。复制此文件将有问题。我想保证它永远不会被复制,所以我做了它的复制构造函数deleted
:
class A {
public:
A();
A(const A&) = delete;
};
A fun() {
return A();
};
int main() {
A a = fun();
};
不幸的是,g ++不会基于以下原因进行编译:
t.cc: In function ‘A fun()’:
t.cc:8:12: error: use of deleted function ‘A::A(const A&)’
return A();
^
t.cc:4:5: note: declared here
A(const A&) = delete;
^
t.cc: In function ‘int main()’:
t.cc:12:13: error: use of deleted function ‘A::A(const A&)’
A a = fun();
^
t.cc:4:5: note: declared here
A(const A&) = delete;
^
但这是一个非常明显的情况,应使用复制省略,因此不应调用复制构造函数。为什么会这样呢?
直到C ++ 17复制省略是一种优化,编译器才不需要执行,因此类必须是可复制的,因为编译器可能要复制(即使实际上不是)。在C ++ 17中,在许多情况下都可以保证复制省略,然后类将不需要复制ctor。
也可以看看:
http://en.cppreference.com/w/cpp/language/copy_elision
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html
https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/(有关“保证复制省略”的内容)
您也许可以使用在类中声明复制构造函数的旧技巧,但实际上并未实现它?只要编译器实际上不调用复制ctor,就应该使编译器满意。我没有对此进行测试,但是我相信它应该在C ++ 17到来之前适用于您的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句