13

標準における「あたかも」というフレーズの正確な意味は何ですか。また、ユーザーが動作の個々の部分を変更できる場合、それはどのように機能しますか。

の非スローバージョンについて話すときの質問は、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 バージョンの動作を自動的に変更する必要があることを意味しますか? 開発者はプレーン バージョンと非スロー バージョンの両方を置き換える必要がありますか?

4

3 に答える 3

2

アロケータの変更operator newにより、準拠する C++ プログラムの動作に目に見える違いが生じる場合は、そうです。スローしないバージョンの実装に変更が必要になる可能性があります。具体的operator deleteには、 new アロケータによって割り当てられたブロックのみを期待する場合、非スローnew を変更する必要があります。

私の読書では、as ifを使用すると、ユーザーが標準をオーバーライドしていない場合に、あなたのような実装が可能になりますoperator new。彼が持っているとすぐに、実装はmallocベースの非スロー operator newを使用してはならず、ユーザー宣言されたバージョンを明示的に呼び出すか、少なくともユーザー宣言されたバージョンを十分に再利用して、適合するプログラムがこれが方法ではないことを伝えることができないようにする必要があります。スローしないバージョンが実装されました。

于 2010-02-21T17:11:06.867 に答える
0

開発者は、プレーン バージョンと非スロー バージョンの両方を置き換える必要があります。GOTWのこの記事をチェックしてください。

私の仮定は、標準がコンパイラ (およびランタイム) のデフォルトの実装に要件を課していることです。したがって、引用する「あたかも」は、コンパイラ ベンダーに、これらのメソッドのデフォルトの実装が指定された基準を満たす必要があることを通知することを意味します。開発者が operator new の 1 つのバージョンのみをオーバーライドすることを選択した場合、operator new の他のすべてのバージョンを準拠させることはコンパイラの責任ではないと思います。それは開発者の責任です。しかし、それはすべて私の意見です。現時点では、前付に何が書かれているのかを確認するための仕様が手元にありません。

于 2010-02-21T17:22:00.993 に答える