Standart haline henüz eklenmemiş olan Kavramlar Lite TS hakkında bilgi almaya çalışıyorum. Kavram gövdelerindeki kısa devinim bağlantılarının davranışı konusunda kafam karıştı. İşte C++ Kavramlar Lite: Kavram gövdelerinde kısa devre
küçük örnektir:#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;
}
gcc 7.1 ve -fconcepts derleme, hata veriyor:
error: cannot call function 'void myfunc(Ts ...) requires myconcept<int, Ts ...> [with Ts = {}]'
Bu örnekte yapı std::common_type<Ts...>
değil çünkü std::common_type_t<Ts...>
yok Ts = {}
ise type
numaralı üyeye sahip olmak. Ancak, ben concepts and constraints üzerinde cppereference.com belgelerine sizeof...(Ts) == 0
memnun
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).
beri şablon argümanı indirimi ikinci Kısıta teşebbüs edilmemelidir ve gereklilik myconcept<int, Ts...>
memnun olması gerektiğini bildiren çünkü bu derleme gerektiğini düşünüyorum. Bu davranış için iyi bir açıklama
#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;
}
var mı:
Garip, fonksiyon Bildiricisi doğrudan gereksinimlerini yerleştirerek programı derlemek neden olur? Teşekkürler.
bu bilgileri bulabilirsiniz "henüz Kavramlar Lite TS standardına birleştirilecek"? Son bilgim kabul edilmedi ... – Klaus