6

noexcept過度に使用すると、テスト可能なライブラリが妨げられる可能性があるという懸念について読みました。

検討:

T& vector::front() noexcept {
    assert(!empty());         // <- this may throw in some test-frameworks
    return data[0];
}

noexceptコンパイラーによる注釈を使用すると、例外コードを最適化できます。これにより、適切な処理assert()(または作成者がここでテストに使用したい関数)を適切に処理できなくなる可能性があります。

したがって、図書館で無条件を使用することは決してなくnoexcept、常にそれをam-I-in-a-test-conditionと「リンク」することが可能かどうか疑問に思います。このような:

#ifdef NDEBUG    // asserts disabled
static constexpr bool ndebug = true;
#else            // asserts enabled
static constexpr bool ndebug = false;
#end

T& vector::front() noexcept(ndebug) {
    assert(!empty());
    return data[0];
}

そして多分それをマクロとして追加します(しかし、私はそれが嫌いです):

#define NOEXCEPT noexcept(ndebug)

T& vector::front() NOEXCEPT {
    assert(!empty());
    return data[0];
}

どう思いますか?これはまったく意味がありますか?それとも実現可能ではありませんか?それとも問題を解決しませんか?それとも全く問題ありませんか?:-)

4

1 に答える 1

3

関数が例外を発行しないことを証明できない場合は、 でタグ付けしないでくださいnoexcept。それはとても簡単です。

そうは言っても、私にnoexcept(ndebug)は理にかなっているように思えます。マクロの背後に隠す理由はありません。多くの場合、テンプレート関数には詳細なnoexcept条件があります。

アセット内の関数がテスト モード中にスローできる場合、プログラムはstd::terminateテスト モード中に自発的にスローできます。assert(これは実際には暗黙的なものによく似ています。)

私が見ることができる唯一の欠点は、これが発生した場合、行番号とヒント メッセージが表示されないことです。noexcept(false)それと、関数から関数を呼び出す場合、コンパイラは警告する必要noexcept(true)があるため、ノイズが発生する可能性があります。

于 2011-09-19T12:44:23.107 に答える