30

明らかにすべてを作ることはできませんconstexpr。そして、何もしなければconstexpr、大きな問題はありません。これまで、多くのコードがそれなしで書かれてきました。

constexprしかし、それを持っている可能性のあるものを平手打ちするのは良い考えですか?これに潜在的な問題はありますか?

4

4 に答える 4

15

コンパイラを気にしません。コンパイラーは、constexpr.

同時に、あなたができるので、そこにそれを平手打ちするのは少しためらいます。コンパイラを気にしない/気にしない場合でも、主な対象者はコードを読んでいる他の人です。少なくとも IMO ではconstexpr、かなり具体的な意味を伝えるために使用し、誤解を招く可能性があるため、他の表現に平手打ちする必要があります。constexprとしてマークされているが、通常のランタイム関数としてのみ使用される関数で何が起こっているのか疑問に思うのは、読者にとって公平だと思います。

同時に、コンパイル時に使用することを正直に期待している関数があり、まだそのように使用していない場合は、 としてマークする方constexprがはるかに理にかなっている可能性があります。

于 2011-07-22T03:33:58.720 に答える
8

constexprあらゆる機会にリスト形式で、特定の順序で並べようとしないのはなぜですか。

  • ワンライナー関数はあまり書かない
  • 私がワンライナーを書くとき、それは通常非constexpr関数に委任されます(例えばstd::get、最近何度か出てきました)
  • それらが操作する型は、必ずしもリテラル型ではありません。はい、参照はリテラル型ですが、参照される型がリテラル自体でない場合、とにかくコンパイル時にインスタンスを持つことはできません
  • それらが返す型は必ずしもリテラルではありません
  • セマンティクスの観点から、コンパイル時にすべてが有用であるとは限らず、意味さえありません。
  • 宣言から実装を分離するのが好き

Constexpr 関数には非常に多くの制限があるため、特別な用途のみに限定されています。最適化ではなく、一般的に望ましい関数のスーパーセットでもありません。私が何かを書くときは多くの場合、メタ関数または通常の関数だけではうまくいかず、特別な考え方を持っているためです。Constexpr 関数は、他の関数とは異なります。

constexprコンストラクターについては、自分の考えを完全に理解できるかどうか確信が持てず、ユーザー定義のリテラルがまだ利用できないため、コンストラクターに関する特定の意見やアドバイスはありません。

于 2011-07-22T03:32:32.843 に答える
0

はいconstそのようなものをどこにでも置くことは常に良い習慣だと思います。たとえばclass、特定のメソッドがメンバーを変更していない場合、常にconst最後にキーワードを配置する傾向があります。

言語の側面とは別に、constネスに言及することは、将来のプログラマー/レビュアーにとって、式がその領域内で const ネスを持っていることを示す良い兆候でもあります。これは優れたコーディングの実践に関連し、読みやすさも向上させます。例 (@Luc から)

constexpr int& f(int& i) { return get(i); }

今置くことは、それも でなければならないことをconstexpr示唆しています。get()constexpr

による問題や影響は見られませんconstexpr

編集constexpr:いくつかの状況でそれらをtemplate引数として使用できるという追加の利点があります。

于 2011-07-22T03:46:00.360 に答える