#include <array>
int value1(int param) {
return param * 2;
}
constexpr int value2(int param) {
return param * 2;
}
int main() {
const int i = 10;
std::array<int, value1(i)> starr1 = {}; // 1
std::array<int, value2(i)> starr2 = {}; // 2
return 0;
}
2
是可以的,但 1
会导致编译错误,因为 std::array
必须创建静态大小数组。 value2()
使用了 constexpr
关键字,返回一个编译时常量值。
那么,编译器是如何推断出 value2(i)
是编译时常量呢?它在编译时调用函数 value2()
吗?
const int value1(int param) {
return param * 2;
}
int main() {
const int i = 10;
std::array<int, value1(i)> starr1 = {}; // 3
return 0;
}
>>> error: call to non-constexpr function ‘const int value1(int)’
此外,
3
仍然会产生编译错误。即使将const
关键字应用于函数value1()
,value1(i)
是否不是编译时常量?
consteval
,这使得情况更加复杂,但我认为这超出了本问题的讨论范围。 - Bartek Banachewicz