2017-05-23 4 views
3

hana's tutorialが、私はそのstatic_assert作業が期待できるとしてか疑問読む:static_assert

template <typename Any> 
auto switch_(Any& a) { 
    return [&a](auto ...cases_) { 
    auto cases = hana::make_tuple(cases_...); 

    auto default_ = hana::find_if(cases, [](auto const& c) { 
     return hana::first(c) == hana::type_c<default_t>; 
    }); 

    static_assert(default_ != hana::nothing, 
     "switch is missing a default_ case"); 

    // ... 
    }; 
} 

文書は、明示的にdefault_は、constexprオブジェクトではありませんので、と述べているとしても、過負荷の場合これらの型のoperator!=constexpr関数です。式のdefault_ != hana::nothingは、引数の1つではないため、定数式にすることはできません。

チュートリアルは言う:私たちはdefault_が非constexprの対象であっても、何もないとの比較 の結果にstatic_assertを使用する方法

お知らせ? Boldly、 Hanaは、コンパイル時に知られている情報が でランタイムに失われていないことを確認しています。明らかに、 default_の場合があります。

チュートリアルでは、この段落で何が参照されていますか、その表現はどのように機能しますか?

答えて

6

あなたは何を誤解していますかconstexprが必要です。 constexpr引数をconstexpr関数に渡すことができ、結果はとなります。constexprになります。

おもちゃ例:その後、

struct foo { 
    int x; 
    foo(int in):x(in){} 
    friend constexpr bool operator==(foo const&, foo const&) { return true; } 
}; 

foo a{1}, b{2}; 
static_assert(a==b, "works"); 

は完全に有効です。

ひどく、fooをヒープに割り当てることができ、==はまだconstexprの式として評価されます。

default_constexprないが、nothingと比較すると、コンパイル時に利用可能であるdefault_の唯一種類情報を用いて行うことができます。 hana::nothingに等しいとは限りませんが、何もありません。

struct toy_nothing_t { 
    friend constexpr bool operator==(toy_nothing_t const&, toy_nothing_t const&) { 
    return true; 
    } 
    template<class T> 
    friend constexpr bool operator==(T const&, toy_nothing_t const&) { 
    return false; 
    } 
    template<class T> 
    friend constexpr bool operator==(toy_nothing_t const&, T const&) { 
    return false; 
    } 
}; 

このtoy_nothing_tも同様の特性を持っています。

関連する問題