2017-02-16 40 views
7

cppreference göre, aşağıdaki kod, yasal:C++, değişken şablon parametrelerinden sonra normal parametrelere izin veriyor mu?

template<typename... Args> 
void f(Args&&..., bool) 
{} 

int main() 
{ 
    f(1, 2, 3, true); // error! see below for details. 
} 
1>main.cpp(59,2): error : no matching function for call to 'f' 
1>   f(1, 2, 3, true); 
1>  ^
1> main.cpp(54,6) : note: candidate function not viable: requires 1 argument, but 4 were provided 
1> void f(Args&&..., bool) 
1>  ^
1> 1 error generated. 
: Ancak

lock_guard(MutexTypes&... m, std::adopt_lock_t t); 

aşağıdaki kod (-std = C++ 1 Z) clang 3.8 derlenmiş edilemez

C++, değişken parametrelerden sonra normal parametrelere izin veriyor mu?

+1

Derleyicim 3.8 sürümüdür. gcc 6.2 de başarısız olur. – xmllmx

+3

'lock_guard 'örneğiyle, bir sınıf yapıcısı olduğundan, tüm şablon argümanlarının işlev çağrısı argümanlarından çıkarılmaya çalışmak yerine önceden biliniyor olduğunu unutmayın. – BoBTFish

+0

C++ 17, C++ 11 değil. – ForEveR

cevap

9

Kodunuzdaki işlev bildirimi geçerli, ancak kesinti bu işlev şablonları için düzgün çalışmıyor. Aşağıdaki kod iyi oluşturulmuş ve uzmanlık void f(int, int, int, bool) başlatır Not:

template<typename... Args> 
void f(Args&&..., bool) {} 

int main() { 
    f<int, int, int>(1, 2, 3, true); 
} 

Not C++ 17, MutexTypes... sınıfının kendi şablon parametreleri şunlardır: böylece

template <class... MutexTypes> class lock_guard; 

bilinir ve çıkarılmaya gerek yoktur. adopt_lock_t ile kurucunun, parametre paketinden sonra adopt_lock_t bağımsız değişkeni oluştuğu için C++ 17 sınıf şablonu bağımsız değişkeni için kullanılamayacağını unutmayın. Eğer komite C++ 11'de uzman olmuş olsaydı, adopt_lock_t argümanını başlangıçta değil, başlangıçta koyarlardı, ama alas şimdi çok geç oldu.

+1

Çok geç değil, bkz. Http://en.cppreference.com/w/cpp/thread/scoped_lock/scoped_lock – user2913094