Clang抱怨"无法覆盖已删除的功能"没有删除任何功能

时间:2015-11-10 08:54:31

标签: c++11 language-lawyer clang++ method-overriding virtual-destructor

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

#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抱怨&#34;未删除的功能&#39; ~C&#39;无法覆盖已删除的功能&#34;: http://goo.gl/Ax6oth

Visual Studio和GCC都没有在此代码中报告错误。这是一个铿锵的缺陷还是什么?

2 个答案:

答案 0 :(得分:9)

static void operator delete(void *, int);

不,这是

 static void operator delete(void *, std::size_t);

并且该类型差异会导致模糊性变得相关:

cppreference.com has

  

T类的隐式声明或默认析构函数是   undefined(直到C ++ 11)被定义为已删除(自C ++ 11以来),如果有的话   以下是真的:

     

[...]

     

隐式声明的析构函数是虚拟的(因为基类   有一个虚拟析构函数)和查找解除分配   function(operator delete()导致调用不明确,删除,   或无法使用的功能。

在标准(草案n4140)§12.4中

  

5如果出现以下情况,则将类X的默认析构函数定义为已删除:

     

[...]

     

(5.3)或者,对于虚拟析构函数,查找非数组   deallocation函数导致歧义或函数   从默认的析构函数中删除或无法访问。

答案 1 :(得分:-2)

我遇到了同样的问题。 @decltype_auto表示这是C ++ 11功能。所以我使用选项“ -std = c ++ 98”绕过了这个问题。