2017-12-18 46 views
9

私は最近、このようなコードに問題がありました。なぜconstを追加しない限り、コンパイラは自動テンプレートパラメータを推測できませんか?

constexpr auto lambda = []{}; 

template<auto& l> 
struct Lambda {}; 

template<auto& l> 
void test(Lambda<l>) {} 

int main() { 
    test(Lambda<lambda>{}); 
} 

両打ち鳴らすをし、GCCは、それがlを推測することができないことを伝えます。しかし

、私はそこのconstを追加した場合:

// ----v 
template<const auto& l> 
void test(Lambda<l>) {} 

を次にすべてが打ち鳴らすで動作します。 GCCはまだ失敗します。ここで何が起こっていますか? const自体を推測することはできますか?どちらの場合でもlを推測しないためにこれはGCCバグですか?

答えて

8

どちらの場合でもlを推測できないGCCバグですか?

これはバグであり、またクラングのためです。プレースホルダ型の非型引数の場合、[temp.arg.nontype]/1は言う:

テンプレートパラメータの型はプレースホルダの種類が含まれている場合は、 推定したパラメータタイプはプレースホルダで テンプレートの引数の型から決定されますタイプ控除。推測された パラメータタイプがテンプレートパラメータ宣言 ([temp.param])に対して許可されていない場合、プログラムは不正です。

それはlはconst参照であることをここ

int main() { 
    auto& l = lambda; 
} 

推測と思われることで、非常に同じプロセスを。

関連する問題