重载运算符 delete 可以有默认参数吗?

Can overloaded operator delete have default parameters?

我正在尝试重载运算符 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; I checked Cppreference, but couldn't find an answer; the default parameter page doesn't mention operators, and the operator overloading & operator delete pages don't mention default parameters. Similarly, the Overloading new and delete SO 的 C++ 常见问题解答中的条目未提及默认参数。

那么,鉴于此,这些行为中的哪些(允许默认参数,或将它们视为错误)符合 C++ 标准?

链接:

An operator function cannot have default arguments (8.3.6), except where explicitly stated below.

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

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