在下面的简单代码片段中:
#include <cstddef>
struct B
{
virtual ~B() = default;
static void operator delete(void *, int);
static void * operator new(size_t, int);
};
struct C : B
{
virtual ~C() = default;
};
clang 3.7抱怨"未删除的函数'~C'无法覆盖已删除的函数":http://goo.gl/Ax6oth
Visual Studio和GCC都没有报告此代码中的错误。是叮当声缺陷还是什么?
static void operator delete(void *, int);
不,是
static void operator delete(void *, std::size_t);
这种类型的差异导致了一种相关的模糊性:
cppreference.com有
类T的隐式声明或默认析构函数为未定义(直到C++11)定义为已删除(从C++11开始),如果以下是真的:
[…]
隐式声明的析构函数是虚拟的(因为基类具有虚拟析构函数),并且查找释放函数(operator delete())导致调用不明确的、已删除的,或不可访问的功能。
在标准(草案n4140)§12.4中,这是
5如果出现以下情况,则X类的默认析构函数被定义为已删除:
[…]
(5.3),或者,对于虚拟析构函数,查找非数组解除分配函数会导致歧义,或者函数已从默认析构函数中删除或无法访问。
我遇到了同样的问题@decltype_auto说这是C++11的一个特性。所以我使用选项"-std=c++98"来绕过这个问题。