Bir işlev parametresi için şablon bağımsız değişken yer tutucu olarak 'otomatik'


22

C ++ 20 autoişlev parametre türü için kullanılmasına izin verir .

Aynı zamanda kullanılmasına izin mu autobir şablon bağımsız değişken tutucu olarak (benzer, ama ruhunda C ++ 17 şablon <oto> bir şekilde) işlev parametre tipleri için?

Yani aşağıdaki kod, C ++ 20 öncesi:

template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
    std::cout << p.first << ", " << p.second;
}

Şu şekilde yazılabilir:

void printPair(const std::pair<auto, auto>& p) {
    std::cout << p.first << ", " << p.second;
}

Bu derleme yapar ve güzel işler kavramlar için deneysel GCC uygulamasıyla.

C ++ 20 ile meşru bir sözdizimi mi?


Duyduğum kadarıyla, kısıtsız auto doğrudan temize dönüşür typename XYZ, bu da meşru sözdizimi olduğunu ima eder. Düzenli .
Fureeish

2
Clang'ın aynı fikirde olmadığını ve Clang ve GCC'nin autoizin verilip verilmeyeceği konusunda [](const std::pair<auto, auto>& p){}( -std=c++2aveya ile birlikte -std=c++17) aynı anlaşmazlığa sahip olduğunu unutmayın .
ceviz


Teşekkürler @DavisHerring - Ben ifadeleri çözdüm
Emir Kirsh

Yanıtlar:


17

Bu sözdizimi C ++ Kavramları Teknik Spesifikasyonu için geçerlidir, ancak C ++ 20 için geçerli değildir. C ++ 20 kavramlarında, autoişlev parametresi türünde yalnızca en üst düzeyde izin verilir. İlgili kural [dcl.spec.auto] paragraf 2'dir :

Bir tutucu-tip belirteci biçimi tip kısıtlaması [opt] autobir şekilde kullanılabilir decl-belirtici arasında decl-belirteci-SEQ a parametre beyanı bir fonksiyon tanımlaması ya da lambda ifadesi bu değilse, ve sondaki dönüş türünü (aşağıya bakın) tanıtan auto tür belirtici , işlev bildirimi veya lambda ifadesinin genel parametre türü yer tutucusudur. [Not: Genel parametre tipi yer tutucusuna sahip olmak, işlevin kısaltılmış bir işlev şablonu (9.3.3.5 [dcl.fct]) veya lambda'nın genel bir lambda (7.5.5 [expr.prim.lambda]) olduğunu gösterir. —End not]

(Yazarken en son çalışma taslağındaki ifadeyi kontrol ederseniz, biraz farklı bir kural bulacaksınız. Yukarıdaki kural, Prag'daki C ++ 20 nihai taslağına oylanan çekirdek sayı 2447 tarafından değiştirildi. komite toplantısı bir hafta önce.)

Decl-belirteci parametre beyan başlangıcında anahtar kelime ve tip isimleri ilk sıra olan parametre işlevi s. Yukarıdaki kural auto, en üst düzeyde izin verir :

void f(auto x);

... ama sadece dekal belirleyici olarak . decl-specifierauto içinde yuvalandığında izin verilmez :

void f(std::vector<auto> x);

... ve parametre türünün başka bir yerine de izin verilmez:

void f(void (*p)(auto));

Vay, bunu bilmiyordum! CWG bağlantısı şu anda 404 veriyor, bu nedenle bu kısıtlamanın gerekçesini kısaca açıklayabilir misiniz?
LF

Bu tamamen hayal kırıklığı yaratıyor.
Fureeish

1
Maalesef, CWG sorunu ve ifadesi değişikliği henüz herkese açık değil. Söz konusu kural open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1141r2.html tarafından getirildi ve niyet / gerekçe genel lambdalar için zaten izin verdiğimizle tutarlı olmaktı .
Richard Smith

4
@LF: CWG sorunu zaten gerçekten alakalı değil: autoSondaki dönüş türünün belirli kullanımlarının bu tür autokullanım olarak sayıldığını ima eden bir ifade hatasını düzeltti .
Davis Herring
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.