Clang抱怨"cannot override a deleted function"而没有删除任何功能



在下面的简单代码片段中:

#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"来绕过这个问题。

最新更新