如果旧的 C++ 编译器没有实现 new 关键字,那么定义它是错误的吗?

Lui*_*bio 2 c++

我正在维护一个旧编译器仍然支持的库,其中之一是 Windows 上的 Visual C++ 2013。到目前为止,我们一直非常保守并坚持使用 C++03;我们现在正在转向 C++11。VC++2013 支持大部分较新的特性,但它不识别noexcept.

当然,将它添加到代码中的规范方法是定义类似的东西

#if (the compiler does not support it)
    #define NOEXCEPT
#else
    #define NOEXCEPT noexcept
#endif
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

void f() NOEXCEPT;
Run Code Online (Sandbox Code Playgroud)

当然,缺点是我们在代码周围散布了宏。

然而,我突然想到(可能是我肩膀上的一个小守护恶魔建议)我也可以写

#if (the compiler does not support it)
    #define noexcept
#endif
Run Code Online (Sandbox Code Playgroud)

之后我可以写

void f() noexcept;
Run Code Online (Sandbox Code Playgroud)

并且该关键字将被较新的编译器正确使用并在较旧的编译器上定义。

这有效(就像它成功编译一样)但是,我感觉有点脏——我不确定我应该这样做。当然,定义关键字的标准是禁止定义的;但是如果编译器不完全支持标准,还是我处于某种灰色区域,它仍然如此吗?

eer*_*ika 6

由于它不是旧标准中的关键字,因此在针对旧标准时,您是,并且在技术上仍然允许定义此类宏。

PS pre-C++11 的典型定义是使用throw()代替noexcept.

PPS 请注意,在 的情况下noexcept,宏不适用于诸如

void foo() noexcept(false);
bool bar = noexcept(foo());
Run Code Online (Sandbox Code Playgroud)

因此,这些语句不能那么容易地向后兼容。鉴于无法支持 的所有用例noexcept,为宏使用不同的名称可能有助于避免混淆。