İhtiyaç ifadelerinin kapalı kapsamdaki değişkenleri “yakalamasına” izin veriliyor mu?


10

Aşağıdaki örnekte, işlev bağımsız değişkenleri, bunları kullanan bir ifadenin iyi biçimlendirilip biçimlendirilmediğini bir zorunlu ifadeyle test etmek için kullanılır. Zorunlu ifade hiçbir argüman almaz; doğrudan işlev kapsamındaki değişkenleri kullanır:

#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);
}

Yukarıdaki kod Clang kavramları dalı ile derlenir. Ancak, GCC10 sadece çağrıyı kabul eder Resize. GCC9 ICE'ler. Clang kabul etmekte haklı mı?


2
ICE her zaman derleyici sorunudur.
Jarod42

Ben yerel değişken yakalamak için izin verilmezse, o kodu reddetmek gerektiğini ya söyleyebilirim (hem böylece Resizeve Eziserolmalıdır reddetmek) ya da her iki işlev derlemek gerekir. Clang'ın doğru olduğunu söyleyebilirim.
Jarod42

@ Jarod42 Evet. GCC davranışı açıkça hatalıdır. Bir PR dosyalayacağım. Ayrıca Clang'ın haklı olduğunu düşünüyorum, ama onaylamak istiyorum.
metalfox

Yanıtlar:


6

Evet, bir gereksinim ifadesi kapsamdaki her şeyi kullanabilir. Sonuçta, iç içe geçmiş bir gereksinim veya başka bir sabit ifade dışında, yalnızca adlandırdığı her şeyin türüne ihtiyaç duyar . Bu, kendi (resmi) parametreleri kadar çevre beyanları için de geçerlidir.

[expr.prim.req] / 5 :

Gereksinimi vücut bir dizi içerir gereksinimleri . Bu gereksinimler yerel parametrelere, şablon parametrelerine ve ekteki bağlamda görülebilen diğer bildirimlere atıfta bulunabilir.

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.