标准中短语“好像”的确切含义是什么,以及当用户可以修改行为的各个部分时它是如何工作的。
在谈论operator new
. 18.4.1.1/7 读到(我的重点):
这个 nothrow 版本的 operator new 返回一个指针,就像从普通版本中获取一样。
我的理解是,只要行为合适,“好像”就不需要特定的实现。所以 ifoperator new
是这样实现的(我知道这不是一个兼容的实现,因为没有循环或使用 new_handler;但我正在缩短它以专注于我的问题):
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s)
{
void *p = malloc(s);
if (p == 0)
throw std::bad_alloc();
return p;
}
然后像这样编写 nothrow 版本是合法的:
// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
return malloc(s);
}
但是假设一个程序替换operator new
为使用其他分配器。“好像”是否意味着编译器必须自动更改 nothrow 版本的行为才能使用其他分配器?开发人员是否需要同时替换普通版本和 nothrow 版本?