Clang 抱怨“无法覆盖已删除的函数”,而没有删除任何函数

Posted

技术标签:

【中文标题】Clang 抱怨“无法覆盖已删除的函数”,而没有删除任何函数【英文标题】:Clang complains "cannot override a deleted function" while no function is deleted 【发布时间】:2016-02-11 02:24:17 【问题描述】:

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

#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 都不会在此代码中报告错误。是clang缺陷还是什么?

【问题讨论】:

签名正确,它编译 我假设 Clang 基于[class.dtor]/5 中的第三个要点拒绝它。我不太确定这是否是正确的阅读方式。 不编译是对的,但是报错信息帮助不大 感谢您的回答。删除 ~B() 和 ~C() 可能是正确的。但是为什么 clang 只在 ~C() =default 上报告错误? GCC 5.2 编译代码没有任何错误(~B() 和~C() 都被删除了) 请注意,我遇到了相同的编译器错误,但这是由于虚拟析构函数在我的(接口)类中未公开。由于错误消息,此评论可能会帮助下一位读者登陆这里。 【参考方案1】:
static void operator delete(void *, int);

不,是

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

并且这种类型差异会导致相关的歧义:

cppreference.com has

类 T 的隐式声明或默认析构函数是 未定义(C++11 前)定义为已删除(C++11 起),如果任何 以下是正确的:

[...]

隐式声明的析构函数是虚拟的(因为基类 有一个虚拟析构函数)和释放的查找 函数(运算符 delete() 导致调用模棱两可、已删除、 或无法访问的功能。

在标准(n4140 草案)§12.4 中是

5 类 X 的默认析构函数在以下情况下被定义为已删除:

[...]

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Clang 抱怨“无法覆盖已删除的函数”,而没有删除任何函数的主要内容,如果未能解决你的问题,请参考以下文章

clang:错误:没有这样的文件或目录:'DDEBUG' [关闭]

安装后没有找到Clang-Tidy

Clang Basics

解决 VC++12 中的模板专业化错误?

从后端的 LLVM/clang 中提取基本块/CFG

为啥以下代码使用clang而不是gcc编译