2016-08-13 7 views
2

コンパイル時に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

+0

を ''ダブル&は 'v'が体内で使用されることはありませんにもかかわらず、' constexpr' – Dani

答えて

4

vは、コンパイル時の表現ではありません。したがって、detail::const_d_ref(v)もコンパイル時の式ではありません。あなたはconstbを変更した場合

あなたの例では動作します:

const bool b = detail::const_d_ref(v); 

cpp.godbolt.org

+1

にする必要がありますか? – Yakk

+0

@Yakk ... "標準"として知られているクリプトノミコンを介した狂気検索... –

+0

@Yakk [expr.const]/2は、かなり似た例です:http://coliru.stacked-crooked.com/a/ 7362e7bde98bb417 –

関連する問題