Apakah diperlukan ekspresi yang diizinkan untuk "menangkap" variabel lingkup yang melampirkan?

10

Dalam contoh berikut, argumen fungsi digunakan untuk menguji dengan ekspresi yang membutuhkan apakah ekspresi yang menggunakannya terbentuk dengan baik. Ekspresi yang membutuhkan tidak membutuhkan argumen; menggunakan variabel dalam lingkup fungsi secara langsung:

#include <cstddef>
#include <vector>

template<typename T>
void Resize(T &v, std::size_t const n)
{
  if constexpr (requires { v.resize(n); })
    v.resize(n);
}

template<typename T>
void Eziser(T &v, std::size_t const n)
{
  if constexpr (requires { v.eziser(n); })
    v.eziser(n);
}

int main()
{
  std::vector<int> v;

  Resize(v, 10u);
  Eziser(v, 10u);
}

Kode di atas mengkompilasi dengan cabang konsep Dentang. Namun, GCC10 hanya menerima panggilan ke Resize. ICE GCC9. Apakah Dentang benar menerimanya?

kotak logam
sumber
2
ICE selalu menjadi masalah penyusun.
Jarod42
Saya akan mengatakan bahwa itu harus menolak kode jika tidak diizinkan untuk menangkap variabel lokal (jadi keduanya Resizedan Eziserharus ditolak) atau kedua fungsi harus dikompilasi. Saya akan mengatakan dentang benar.
Jarod42
@ Jarod42 Ya. Perilaku GCC jelas buggy. Saya akan mengajukan PR. Saya juga berpikir bahwa Dentang benar, tetapi saya ingin mengkonfirmasi.
metalfox

Jawaban:

6

Ya, membutuhkan-ekspresi dapat menggunakan apa pun yang ada dalam ruang lingkup. Lagi pula, ia hanya membutuhkan jenis apa pun yang ia sebutkan, kecuali dalam persyaratan bersarang atau ekspresi konstan lainnya. Itu berlaku untuk deklarasi yang mengelilinginya seperti parameternya sendiri (formal).

[expr.prim.req] / 5 :

Badan -persyaratan berisi urutan persyaratan . Persyaratan ini dapat merujuk pada parameter lokal, parameter templat, dan deklarasi lain yang terlihat dari konteks terlampir.

Davis Herring
sumber