constexprとして宣言された関数を実行時に呼び出すことができる可能性があるため、コンパイラは、コンパイル時と実行時のどちらで計算するかを決定する基準はどれですか。
template<typename base_t, typename expo_t>
constexpr base_t POW(base_t base, expo_t expo)
{
return (expo != 0 )? base * POW(base, expo -1) : 1;
}
int main(int argc, char** argv)
{
int i = 0;
std::cin >> i;
std::cout << POW(i, 2) << std::endl;
return 0;
}
この場合、iはコンパイル時に不明です。これが、コンパイラがPOW()を実行時に呼び出される通常の関数として扱う理由である可能性があります。ただし、このダイナミックは、見た目は便利ですが、実用的ではない意味があります。たとえば、コンパイル時にconstexpr関数を計算してもらいたい場合があります。コンパイラは、コンパイル時にも機能するのに、代わりに通常の関数として処理することを決定します。よくある落とし穴はありますか?