Bla*_*ger 10 c++ delete-operator virtual-destructor
以下类(带有虚拟析构函数)包含模板化的operator delete:
struct S\n{\n virtual ~S() {}\n template <typename... Args>\n void operator delete(void* ptr, Args... args);\n};\nRun Code Online (Sandbox Code Playgroud)\nargs可以为空,所以我认为S::operator delete也可以在预期常规时使用delete。
但是(使用 g++),我收到错误\xef\xbc\x9a
\n\n\n错误:“S”没有合适的“操作符删除”
\n
难道“合适的‘操作删除’”就不能成为一个模板吗?
\nSne*_*tel 15
没有!出于同样的原因,template<typename T> S(T const&) 没有定义复制构造函数。很多C++的特殊成员函数都要求不能是模板。在这种情况下,仅从新放置表达式中选择模板以供operator delete使用。
其推理基本上是“安全总比后悔好”。如果模板可以在这些特殊情况下绑定,那么很容易意外地声明您不想要的特殊成员函数。在复制构造函数的情况下,请注意如何声明这样的构造函数(只是这样您就可以绑定到任何整数类型),如果它算作复制构造函数,则会奇怪地抑制类的移动构造。
当然,如果这确实是您想要的,您可以只声明非放置删除、复制构造函数或您拥有的东西,并将其委托给模板。因此,这里的设计既提供了安全性,又不会过度限制您。
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |