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 抱怨“无法覆盖已删除的函数”,而没有删除任何函数的主要内容,如果未能解决你的问题,请参考以下文章