標準における「あたかも」というフレーズの正確な意味は何ですか。また、ユーザーが動作の個々の部分を変更できる場合、それはどのように機能しますか。
の非スローバージョンについて話すときの質問は、C++標準に関するものですoperator new。18.4.1.1/7 読み取り (強調):
この非スロー バージョンの 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;
}
次に、次のように 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 バージョンの動作を自動的に変更する必要があることを意味しますか? 開発者はプレーン バージョンと非スロー バージョンの両方を置き換える必要がありますか?