【发布时间】:2016-05-23 23:43:18
【问题描述】:
我正在尝试重载运算符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++ FAQ 中的 Overloading new and delete 条目也没有提及默认参数。
那么,鉴于此,这些行为(允许默认参数,或将其视为错误)中的哪一个符合 C++ 标准?
链接:
【问题讨论】:
标签: c++ visual-c++ g++ operator-overloading default-arguments