Si consideri il seguente codice:Tipo conversione al modello di non-tipo di argomento senza constexpr
struct A {
constexpr operator int() { return 42; }
};
template <int>
void foo() {}
void bar(A a) {
foo<a>();
}
int main() {
foo<A{}>();
const int i = 42;
foo<i>(); // (1)
A a{};
static_assert(i == a, "");
bar(a);
foo<a>(); // error here
}
Clang 3.7 con C++ 14 accetta questo, mentre gcc 5.2.0 con C++ 14 non lo fa, la produzione del seguente messaggio:
/tmp/gcc-explorer-compiler1151027-68-1f801jf/example.cpp: In function 'int main()': 26 : error: the value of 'a' is not usable in a constant expression foo<a>(); ^ 23 : note: 'a' was not declared 'constexpr' A a{}; ^ Compilation failed
Modifica a
essere constexpr
come suggerito da gcc corregge l'errore di compilazione gcc, ma senza constexpr
, che compi ha ragione?
Per me, sembra che a
debba essere "utilizzabile in espressione costante", come certifica static_assert
. Inoltre, il fatto che i
possa essere utilizzato allo stesso modo (contrassegnato con (1)
) e il fatto che compili lo bar()
, mi fa anche pensare che gcc sia errato.
UPD: segnalato un bug nei confronti gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68588
Cambiare '' const' da opere constexpr' [ demo] (http://coliru.stacked-crooked.com/a/1bc480f2de523b5e). – Jarod42
@ Jarod42, sì, vedi la mia modifica. – Petr