重载运算符 delete 可以有默认参数吗?
Can overloaded operator delete have default parameters?
我正在尝试重载运算符 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; 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)。在所有其他情况下,它们都是不允许的。
我正在尝试重载运算符 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; 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)。在所有其他情况下,它们都是不允许的。