teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

定数式を要求する文脈と例を追加

2020/10/19 14:18

投稿

SaitoAtsushi
SaitoAtsushi

スコア5740

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
+ ```