我正在尝试重载运算符new
和delete
,并注意到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 ++标准?
链接:
答案 0 :(得分:8)
除下面明确说明的情况外,运算符函数不能有默认参数(8.3.6)。
(C ++ 14标准,[over.oper] / 8; C ++ 03标准中出现了相同的句子。)
允许默认参数的特定情况是函数调用运算符(operator()
;参见[over.call] / 1)。在所有其他情况下,他们是被禁止的。