没有删除任何功能时,Clang会抱怨“无法覆盖已删除的功能”

问题描述 投票:6回答:2

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

#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都没有在此代码中报告错误。这是一个铿锵的缺陷还是什么?

c++11 language-lawyer clang++ method-overriding virtual-destructor
2个回答
9
投票
static void operator delete(void *, int);

不,它是

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

而且这种类型差异会导致模糊性变得相关:

cppreference.com has

如果满足以下任何条件,则类T的隐式声明或默认析构函数未定义(直到C ++ 11)被定义为已删除(自C ++ 11起):

[...]

隐式声明的析构函数是虚拟的(因为基类具有虚拟析构函数),并且查找解除分配函数(operator delete()会导致调用不明确,已删除或不可访问的函数。

并且在标准(草案n4140)§12.4中

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

[...]

(5.3)或者,对于虚拟析构函数,查找非数组释放函数会导致模糊或在默认析构函数中删除或无法访问的函数中。


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.