回答編集履歴
1
定数式を要求する文脈と例を追加
test
CHANGED
@@ -7,3 +7,63 @@
|
|
7
7
|
|
8
8
|
|
9
9
|
ただし、そのような言語上の理屈とは別に最適化による定数畳み込みがかかって定数になることはあります。
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
----
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
定数式が要求される文脈として代表的なものは
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
- `constexpr` 指定が付いた変数の初期化
|
22
|
+
|
23
|
+
- 配列を宣言するときの要素数
|
24
|
+
|
25
|
+
- テンプレート引数に渡す値
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
があります。
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
----
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
変数に `constexpr` を付けるのが定数式の文脈のコントロールとして最もわかりやすいと思うのでそれを元に例を示します。
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
```cpp
|
42
|
+
|
43
|
+
#include <iostream>
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
constexpr int num(int a, int b) {
|
48
|
+
|
49
|
+
return a + b;
|
50
|
+
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
int main(void) {
|
56
|
+
|
57
|
+
int x = num(1, 5); // ← このとき num は実行時に呼び出される
|
58
|
+
|
59
|
+
constexpr int y = num(1, 5); // ← このとき num はコンパイル時に呼ばれる
|
60
|
+
|
61
|
+
constexpr int z = num(x, x); // ← このとき num はコンパイル時に呼ばれるが x は定数式ではないのでエラー
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
std::cout << x << y << z << std::endl;
|
66
|
+
|
67
|
+
}
|
68
|
+
|
69
|
+
```
|