問題タブ [noexcept]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - インライン関数 noexcept を宣言するのは理にかなっていますか?
私が知る限り、SO コミュニティは、関数を宣言することで、他のnoexcept
方法では不可能な意味のあるコンパイラーの最適化が可能になるかどうかについて意見が分かれています。(特にコンパイラの最適化について話しているのであって、に基づくライブラリ実装の最適化ではありませんmove_if_noexcept
。) この質問の目的のために、noexcept
意味のあるコード生成の最適化が可能になると仮定しましょう。inline
その前提で、関数を宣言することは理にかなっていますnoexcept
か? そのような関数が実際にインライン化されていると仮定すると、呼び出しサイトで関数try
から生じるコードの周りにブロックに相当するものをコンパイラが生成する必要があるように思われます。それなしinline
terminate
noexcept
、そのtry
ブロックは不要のようです。
noexcept
私の当初の関心は、Lambda 関数が暗黙的に であることを考えると、宣言する意味があるかどうかということでしたが、Lambdaだけでなく、どの関数でinline
も同じ問題が発生することに気付きました。inline
c++ - 例外 noexcept のコピー コンストラクターを宣言する必要がありますか?
より効果的な C++で、Scott Meyers は言います
C++ は、例外としてスローされたオブジェクトがコピーされることを指定します。
次に、コピー コンストラクターが順番に例外をスローすると、std::terminate
が呼び出されるので、これがすべての例外のコピー コンストラクターを宣言する正当な理由になるnoexcept
と思います (また、ヒープからメモリを割り当てるオブジェクトをスローしないように、のようにstd::string
)。
std::bad_alloc
しかし、GCC 4.7.1 に同梱されている標準ライブラリの実装では、とのコピー コンストラクタが定義されていないことに驚きましたstd::exception
。彼らはそれらを定義すべきではありませんnoexcept
か?
c++ - unique_ptr の operator* が noexcept ではないのはなぜですか?
C++11 およびドラフト C++14 では、逆参照演算子 (operator*
およびoperator->
)shared_ptr
は bothnoexcept
です。しかしunique_ptr
、operator->
は ですがnoexcept
、そうでoperator*
はありません。operator*
ではないのはなぜですかunique_ptr
noexcept
(または、なぜ であるoperator*
のですshared_ptr
noexcept
か)?
c++ - 属性のメンバー関数のみが noexcept の場合、noexcept を宣言する方法は?
このコードは、clang(3.4) ではコンパイルできますが、gcc (4.7.1) ではコンパイルできません。誰が私が間違っているのか教えてもらえますか?
編集
gcc エラー メッセージは次のとおりです。
c++ - std::chrono::...::time_point のコンストラクタは noexcept であるべきですか? (または、なぜそうではないのですか?)
アトミックな time_point を保持しようとしてこの問題が発生しました。参照してください (デフォルトのコンストラクターが利用可能な場合、アトミックには noexcept デフォルトのコンストラクターが必要です): http://cplusplus.github.io/LWG/lwg-active.html#2165
単純な問題は、std::atomic または同様のものが現在の std の下でコンパイルに失敗することです。
std::chrono::clock_type::now() を考慮すると、 noexcept です。タイムポイント自体がそうではないのは奇妙に思えます。
c++ - STL コンテナーの swap メンバー関数が noexcept と宣言されていないのはなぜですか?
N3797の時点で、C++ 標準ではswap
、特に指定されていない限り、コンテナーの関数が例外をスローしないことを要求しています[container.requirements.general]
( 23.2.1§10 )。
swap
スローしないように指定されているメンバー関数が宣言されていないのはなぜnoexcept
ですか?
同じ質問が特殊な非メンバーswap
オーバーロードにも当てはまります。