コンパイル時にconstexpr
関数の評価を強制するには、にconstexpr
という変数に戻り値を代入する必要があります。clangでconstexprのコンパイル時間を強制的に評価する
constexpr bool const_d_ref(const double& v) { return false; }
int main() {
constexpr double dd = 0.0;
constexpr bool cb = const_d_ref(dd);
}
これはg++
とclang++
で正常に動作するようです。
消費者からconstexpr
を隠すために、私はconstexpr
変数に 戻り値を割り当て、それを返す新しい関数を作成し、namespace detail
に実際の機能 定義を動かします。
namespace detail {
constexpr bool const_d_ref(const double& v) { return false; }
}
constexpr bool const_d_ref(const double& v) {
constexpr bool b = detail::const_d_ref(v);
return b;
}
int main() {
constexpr double dd = 0.0;
bool b = const_t_ref(dd);
constexpr bool cb = detail::const_t_ref(dd);
}
それはg++
で期待通りに動作しますが、コンパイラエラーを返しclang++
:
error: constexpr variable 'b' must be initialized by a constant expression
は私が許可をやっていますか?またはclang
が制限的になりますか?またはgcc
は許可されていますか?
cpp.godbolt.org:constexpr bool const_d_ref(const double& v) {
でgcc 6.1 & clang 3.8
を ''ダブル&は 'v'が体内で使用されることはありませんにもかかわらず、' constexpr' – Dani