"似乎"在语言标准中

R S*_*hko 13 c++ standards standards-compliance

标准中"似乎"这个短语的确切含义是什么?当用户可以修改行为的各个部分时,它是如何工作的.

在讨论nothrow版本时,问题是关于C++标准operator new.18.4.1.1/7读(我的重点):

这个nothrow版本的operator new返回一个获得的指针,好像从普通版本获得的一样.

我的理解是,只要行为合适,"似乎"就不需要特定的实现.所以,如果operator 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;
}
Run Code Online (Sandbox Code Playgroud)

那么写下这样的nothrow版本是合法的:

// NOTE - not fully compliant - for illustration purposes only.
void *operator new(std::size_t s, const std::nothrow_t &nt)
{
    return malloc(s);
}
Run Code Online (Sandbox Code Playgroud)

但是,假设程序替换operator new为使用其他分配器."似乎"意味着编译器必须自动更改nothrow版本的行为才能使用其他分配器吗?开发人员是否需要更换普通版本和非版本版本?

Mic*_*urr 7

从1.9"程序执行:

符合实现需要模拟(仅)抽象机器的可观察行为

并在一个信息脚注中:

这项规定有时被称为"假设"规则,因为只要结果就像是遵守了要求,只要可以从可观察的行为中确定,实施就可以自由地忽视本国际标准的任何要求.该计划.例如,实际实现不需要评估表达式的一部分,如果它可以推断出它的值没有被使用,并且没有产生影响程序的可观察行为的副作用.

该标准特别注意到"as-if"要求是对nothrow版本的替换版本的绑定operator new().但是,正如我读到的那样,该要求将由程序员覆盖,operator new()而不是编译器.这个责任的另一面是我认为标准几乎要求operator new()库提供的nothrow的默认实现必须new在try/catch 中调用std::bad_allocthrow 并执行某些操作,如果被捕获则返回0 .

如果编译器/链接器/其他任何东西足够聪明,可以确定当使用默认投掷new()时,默认非投掷new()可以采用快捷方式,但是如果默认投掷new()被覆盖,默认非投掷new()必须采取不同的行动.我确信这在技术上是可行的(即使你可能无法在标准C++中表达).如果曾经有过这样的实现,我会感到惊讶.

我可能会过多地阅读这个要求,但我认为这是可以推断的.