2017-07-03 17 views
5

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.

+0

bu bilgileri bulabilirsiniz "henüz Kavramlar Lite TS standardına birleştirilecek"? Son bilgim kabul edilmedi ... – Klaus

cevap

2

Katmanın açıklamalarında görüntülenen açıklama doğrudur. n4674 draft seçin ifadeler de oldukça açıktır: Biz kavramlardan nasıl gideceğini

A conjunction is a constraint taking two operands. A conjunction of constraints is satisfied if and only if both operands are satisfied. The satisfaction of a conjunction’s operands are evaluated left-to-right; if the left operand is not satisfied, template arguments are not substituted into the right operand, and the constraint is not satisfied. […]

(. 17.10.1.1 Mantıksal işlemleri itibaren [temp.constr.op] §2) ifadeler tüm yana tam kurduğunuzu ve atomik kısıtlamaların birleşimiyle ya da ayrışmasıyla ilgili şablonlar oldukça uzun olduğu için, layıkların açıklamalarına sadık kalacağız.

Is there a good explanation for this behavior? Thanks.

Bu yazıdan yola çıkarak kavramların GCC uygulaması çok deneyseldir. Bir çözüm olarak, kendi konseptine içine sorunlu bir parçasını planı ayrı:

template<typename T, typename... Ts> 
concept bool refactored = std::is_same_v<T, std::common_type_t<Ts...>>; 

template<typename T, typename... Ts> 
concept bool myconcept = sizeof...(Ts) == 0 || refactored<T, Ts...>; 

Coliru demo

İlgili konular