我正在尝试重载运算符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在线和Rextester测试)正确编译。
尽管看起来GCC可以按照预期进行编译,但MSVC会发出错误C2831;我检查了Cppreference,但找不到答案。 default parameter页面未提及运算符,而operator overloading和operator delete页面未提及默认参数。同样,SO的C++常见问题解答中的Overloading
new
and delete
条目也没有提及默认参数。因此,鉴于此,以下哪种行为(允许使用默认参数或将其视为错误)符合C++标准?
链接:
最佳答案
(C++ 14标准,[over.oper]/8; C++ 03标准中出现相同的句子)。
允许使用默认参数的特定情况是函数调用运算符的情况(operator()
;请参见[over.call]/1)。在所有其他情况下,均不允许这样做。