可以重载的operator delete有默认参数吗?

时间:2016-05-23 23:43:18

标签: c++ visual-c++ g++ operator-overloading default-arguments

我正在尝试重载运算符newdelete,并注意到MSVC和GCC在operator delete的实现方面似乎有所不同。请考虑以下代码:

#include <cstddef>

struct CL {
    // The bool does nothing, other than making these placement overloads.
    void* operator new(size_t s, bool b = true);
    void operator delete(void* o, bool b = true);
};
// Functions are simple wrappers for the normal operators.
void* CL::operator new(size_t s, bool b) { return ::operator new(s); }
void CL::operator delete(void* o, bool b) { return ::operator delete(o); }

auto aut = new (false) CL;

此代码将与GCC(使用Ideone和TutorialsPoint在线编译器进行测试)正确编译,但不能与MSVC(使用MSVS 2010,MSVS 2015 online和Rextester测试)进行编译。

虽然看起来GCC按照人们的预期编译它,但MSVC会发出错误C2831;我检查了Cppreference,但找不到答案; default parameter页面未提及运算符,operator overloading&amp; operator delete页面未提及默认参数。同样,SO的C ++ FAQ中的Overloading new and delete条目没有提到默认参数。

因此,鉴于此,哪些行为(允许默认参数或将其视为错误)符合C ++标准?

链接:

1 个答案:

答案 0 :(得分:8)

  

除下面明确说明的情况外,运算符函数不能有默认参数(8.3.6)。

(C ++ 14标准,[over.oper] / 8; C ++ 03标准中出现了相同的句子。)

允许默认参数的特定情况是函数调用运算符(operator();参见[over.call] / 1)。在所有其他情况下,他们是被禁止的。