14

交換しますか

const int one = 1;
const int two = 2;

これとともに?

constexpr int one = 1;
constexpr int two = 2;

両方のブロックが意味的に同一であり、現在は単なる好みの問題であるという私の理解は正しいですか?

一方、 がconstexpr示唆するconstように、違いを生まない些細な状況であっても、より制限的な形式を常に優先する方が一貫性があると主張できますか?

(右辺の式がより複雑になると状況が完全に変わることを理解しています。したがって、明確にするために、質問は式が固定整数である最も単純なケースにのみ焦点を当てています。)

4

2 に答える 2

13

constconstexprは意味的に同一である」というあなたの声明は修正する必要があると思います。どちらも値を変更できないオブジェクトを宣言しますがconstexpr、コンパイル時に初期化式を計算可能にする必要もあります。

右辺の式がコンパイル時に計算できない場合、使用constexprは問題外です。一方、イニシャライザがリテラルである限り、 を使用できconstexprますが、変数のセマンティクスが何であるかを考慮してください。定数変数は、値がコンパイル時に計算可能であるべきものを本当に表していますか?

ソフトウェアの保守/進化の光学では、変数を初期化する方法を時間の経過とともに変更する可能性があります。今日の初期化子はリテラルですが、明日はより複雑な式になる可能性があります。

現在値を割り当てる方法に関係なくi、リテラル以外で初期化する必要があり、初期化式はコンパイル時に計算できない可能性があると思いますか? constその場合は、現在リテラルで初期化していても、variable を作成してください。それ以外の場合は、それを作成しconstexprます。

つまり、変数のセマンティクスを最もよく表す修飾子を選択してください。

于 2013-02-26T00:01:16.653 に答える
0

その場合は交換constしなくても構いませんが、constexpr

const int one = 1;
const int two = 2;

このような定数変数がある場合、

const int three = one + two;

次のように定義したほうがよいでしょう。constexpr

constexpr int three = one + two;

コンパイル期間中に 3 つが計算されるようにします。

現代のコンパイラは最適化を行い、const.

constexpr の使用例を取り上げただけです。計算が複雑で、コンパイラが最適化できませんでした。

于 2021-05-13T09:12:32.153 に答える