回答編集履歴
1
定数式を要求する文脈と例を追加
answer
CHANGED
@@ -2,4 +2,34 @@
|
|
2
2
|
|
3
3
|
`constexpr` が呼出されるのが実行時かコンパイル時かを決定づけるのは引数ではなく「その関数の結果を受け取る側」です。 定数式が要求されている場に現れるときにコンパイル時に呼び出されることになっています。
|
4
4
|
|
5
|
-
ただし、そのような言語上の理屈とは別に最適化による定数畳み込みがかかって定数になることはあります。
|
5
|
+
ただし、そのような言語上の理屈とは別に最適化による定数畳み込みがかかって定数になることはあります。
|
6
|
+
|
7
|
+
----
|
8
|
+
|
9
|
+
定数式が要求される文脈として代表的なものは
|
10
|
+
|
11
|
+
- `constexpr` 指定が付いた変数の初期化
|
12
|
+
- 配列を宣言するときの要素数
|
13
|
+
- テンプレート引数に渡す値
|
14
|
+
|
15
|
+
があります。
|
16
|
+
|
17
|
+
----
|
18
|
+
|
19
|
+
変数に `constexpr` を付けるのが定数式の文脈のコントロールとして最もわかりやすいと思うのでそれを元に例を示します。
|
20
|
+
|
21
|
+
```cpp
|
22
|
+
#include <iostream>
|
23
|
+
|
24
|
+
constexpr int num(int a, int b) {
|
25
|
+
return a + b;
|
26
|
+
}
|
27
|
+
|
28
|
+
int main(void) {
|
29
|
+
int x = num(1, 5); // ← このとき num は実行時に呼び出される
|
30
|
+
constexpr int y = num(1, 5); // ← このとき num はコンパイル時に呼ばれる
|
31
|
+
constexpr int z = num(x, x); // ← このとき num はコンパイル時に呼ばれるが x は定数式ではないのでエラー
|
32
|
+
|
33
|
+
std::cout << x << y << z << std::endl;
|
34
|
+
}
|
35
|
+
```
|