#constexpr if と local struct の評価のタイミングについて
こんにちは!またよろしくお願いします!
ペコリ(o_ _)o))
初めに、次のコードはコンパイルエラーになります。case: 1
wandbox
cpp
1#include <type_traits> 2 3struct S { 4 constexpr auto operator()() const -> decltype(false) { 5 return false; 6 } 7}; 8 9template<typename T> 10constexpr T get() { 11 if constexpr (std::is_same_v<int, T>) return 0; 12 else static_assert(S{}(), "Lambda expression is evaluated."); 13} 14 15int main() { 16 get<int>(); 17}
つぎに、これはコンパイルが通ります。case: 2
wandbox
cpp
1#include <type_traits> 2 3template<typename T> 4constexpr T get() { 5 struct S { 6 constexpr auto operator()() const -> decltype(false) { 7 return false; 8 } 9 }; 10 if constexpr (std::is_same_v<int, T>) return 0; 11 else static_assert(S{}(), "Lambda expression is evaluated."); 12} 13 14int main() { 15 get<int>(); 16}
質問1: case: 2 の S{}() は、get()が定義される際になぜ評価されないのでしょうか。local struct S はテンプレートではないので、インスタンス化を抑制するconstexpr ifは関係なく、case: 1 と同様に評価されるのではないでしょうか...? それとも、local struct S はテンプレート引数Tに依存しているのでしょうか...
質問2: constexpr ifとtwo-phase name lookupは関係があったのでしょうか。ずっとそう思っていたのですが、constexpr ifは"テンプレート引数に依存しているものの実体化を遅延する"と考えると、名前の検索のタイミングは関係ないような気がします...。
(追記)
質問2に関して、インスタンス化されていないテンプレートはそもそも使えないので、テンプレート定義の中に依存名があってもなくても同じと考えられないでしょうか。
(追記の追記) すみません...質問2はなかったことにしてください...
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/30 10:30 編集