在下面的简单代码片段中:
#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都没有在此代码中报告错误。这是一个铿锵的缺陷还是什么?
答案 0 :(得分:9)
static void operator delete(void *, int);
不,这是
static void operator delete(void *, std::size_t);
并且该类型差异会导致模糊性变得相关:
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”绕过了这个问题。