我正在尝试重载运算符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在线和Rextester测试)正确编译。

尽管看起来GCC可以按照预期进行编译,但MSVC会发出错误C2831;我检查了Cppreference,但找不到答案。 default parameter页面未提及运算符,而operator overloadingoperator delete页面未提及默认参数。同样,SO的C++常见问题解答中的Overloading new and delete 条目也没有提及默认参数。

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

链接:
  • On Ideone
  • On Rextester (as VC++)
  • 最佳答案



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

    允许使用默认参数的特定情况是函数调用运算符的情况(operator();请参见[over.call]/1)。在所有其他情况下,均不允许这样做。

    10-06 15:24