Le espressioni richieste sono autorizzate a "catturare" le variabili dell'ambito allegato?


10

Nel seguente esempio, gli argomenti della funzione vengono utilizzati per verificare con un'espressione obbligatoria se un'espressione che li utilizza è ben formata. L'espressione richiede non accetta argomenti; utilizza direttamente le variabili nell'ambito della funzione:

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

Il codice sopra si compila con il ramo dei concetti di Clang. Tuttavia, GCC10 accetta solo la chiamata a Resize. GCC9 ICE. Clang ha ragione ad accettarlo?


2
ICE è sempre un problema del compilatore.
Jarod42,

Direi che o dovrebbe rifiutare il codice se non è consentito acquisire la variabile locale (quindi entrambi Resizee Eziserdovrebbero essere rifiutati) o entrambe le funzioni dovrebbero essere compilate. Direi che clang ha ragione.
Jarod42,

@ Jarod42 Sì. Il comportamento di GCC è chiaramente errato. Presenterò un PR. Penso anche che Clang abbia ragione, ma vorrei confermare.
metalfox

Risposte:


6

Sì, un'espressione obbligatoria può utilizzare tutto ciò che è nell'ambito. Dopotutto ha bisogno solo del tipo di tutto ciò che nomina, tranne che in un'espressione nidificata o altra espressione costante. Questo vale per le dichiarazioni circostanti tanto quanto i suoi parametri (formali).

[expr.prim.req] / 5 :

Il corpo dei requisiti contiene una sequenza di requisiti . Questi requisiti possono fare riferimento a parametri locali, parametri del modello e qualsiasi altra dichiarazione visibile dal contesto allegato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.