まだコンセプトライトTSが標準に統合されていないことを知りたいと思っています。私は、コンセプト体における論理和を短絡させる行動について混乱している。ここC++ Concepts Lite:コンセプト本体の短絡
が小さい例である:GCC 7.1と-fconceptsしてコンパイル
#include <type_traits>
#include <iostream>
template <typename T, typename ... Ts> concept bool myconcept =
(sizeof...(Ts) == 0) || (std::is_same_v<T, std::common_type_t<Ts...>>);
template <typename ... Ts>
void myfunc(Ts ... args) requires myconcept<int, Ts...> {
(... , (std::cout << args << std::endl));
}
int main() {
myfunc();
return 0;
}
、エラーを与える:この例では
error: cannot call function 'void myfunc(Ts ...) requires myconcept<int, Ts ...> [with Ts = {}]'
構造体std::common_type<Ts...>
がないので、std::common_type_t<Ts...>
が存在しませんTs = {}
の場合、メンバーはtype
です。しかし、私はconcepts and constraintsにcppereference.comのマニュアルがsizeof...(Ts) == 0
が満たされる
Disjunctions are evaluated left to right and short-circuited (if the left constraint is satisfied, template argument deduction into the right constraint is not attempted).
ので、テンプレート引数控除は、第2の制約で試行されてはならないとの要件myconcept<int, Ts...>
が満たさなければならないことを述べているので、これはコンパイルすべきだと思います。
不思議なこと、プログラムをコンパイルする原因と宣言子の機能に直接要件を置く:
#include <type_traits>
#include <iostream>
template <typename ... Ts>
void myfunc(Ts ... args) requires (sizeof...(Ts) == 0) || (std::is_same_v<int, std::common_type_t<Ts...>>) {
(... , (std::cout << args << std::endl));
}
int main() {
myfunc();
return 0;
}
は、この動作のための良好な説明がありますか?おかげさまで
を「まだ標準にマージされる概念LiteのTSは、」私は、この情報を見つけることができますか?私の最後の情報は受け入れられなかった... – Klaus