2014-09-16 14 views
23

gcc 4.9 aşağıdaki kodları sağlar, ancak gcc 4.8 ve clang 3.5.0 onu reddeder.Düzenli bir işlevde otomatik olarak GCC 4.9 uzantısı olarak otomatik mi?

void foo(auto c) 
{ 
    std::cout << c.c_str(); 
} 

ben 4.9 içinde warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic] olsun ama 4.8 ve clang I error: parameter declared 'auto' olsun.

+1

gcc 4.9.1 ile, g ++ -std = C++ 11' bana "uyarı verir: parametre beyanında 'auto' kullanımı sadece -std = C++ 1y veya -std = gnu ++ 1y ile kullanılabilir ". 'G ++ -std = C++ 14' ile uyarı yoktur. –

+5

@KeithThompson, Weird, kesinlikle C++ 14'ün bir parçası değil (lambdas, evet, ama diğer işlevler değil). – chris

+0

@chris: Gcc 4.9.1 ile oyun oynamak, [işte bir örnek] (http://codepad.org/mm1jRI4X). Codepad.org tarafından kullanılan derleyici bu sorunu çözmez, ancak her satırda beklenen boyut ve değerle 4 satır çıktı alırım. Görünüşe göre 'foo' bir şablon gibi davranıyor. –

cevap

16

Evet, bu bir uzantıdır. 'Kavramlar' önerisinin bir parçası olarak C++ 17'ye eklenecek gibi görünüyor. Bu kavramlar Lite

+9

'C++ 17'ye 'kavramlar' teklifinin bir parçası olarak eklenmesi muhtemel, inanıyorum. 'Gerçekten de, [genel işlevler] olarak bilinen (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4040.pdf) ([dcl.fct]). – user657267

+1

@ user657267 [Concepts Technical Specification] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4333.pdf) 'de bunun için kullanılan ifadeler "Kısaltılmış İşlev" gibi görünüyor. Şablonlar". –

+1

@JonathanMee Bilmekte fayda var, sanırım "genel işlev" de çok ... jenerik. – user657267

11

sadece template<class T> daha ayrıntılı yerini

template<class T> 
void foo(T c) 
{ 
    std::cout << c.c_str(); 
} 

auto adına konuşuyorum. Benzer şekilde, İşte

template<class T> 
requires Sortable<T>{} 
void foo(T c) 

için bir kısaltma olarak

void foo(Sortable c) 

yazabilir, Sortable şablon parametresine gereklerini resmileştirmek constexpr yüklemler bir bağlantılı olarak uygulanan bir kavramdır. Bu gereksinimleri kontrol etmek, isim araması sırasında yapılır.

Bu anlamda, auto tamamen kısıtlanmamış bir şablondur.

İlgili konular