Baru-baru ini, saya tiba-tiba menemukan bahwa gcc dan msvc menerima kode berikut (perhatikan requires-clause di daftar template):

#include <vector>

template <template <class> requires true class>
void f() {}

int main() {
  f<std::vector>();
}

Dan clang menolak tata bahasanya dengan:

<source>:3:28: error: template template parameter requires 'class' after the parameter list
template <template <class> requires true class>
                           ^

Kompiler mana yang harus saya percayai? Apakah kode ini valid secara tata bahasa?

10
康桓瑋 4 April 2021, 19:17

1 menjawab

Jawaban Terbaik

Ya, ini tampaknya tata bahasa hukum. Sebuah template dimulai dengan template-head yang

template < template-parameter-list > requires-clause opt

Lalu template-parameter-list< /a> bisa jadi

parameter-templat

Di mana template-parameter dapat

tipe-parameter

Lalu type-parameter dapat menjadi

template-head type-parameter-key ...opt identifieropt

Sekarang ini termasuk template-head yang memungkinkan requires-clause seperti yang disebutkan di atas.

2
cigien 4 April 2021, 16:42