ma compila in gcc 4.9.0. Vedere live example:Per quanto posso dire, questo codice non dovrebbe essere compilato, in base a §5.19/3 e § 5.19/2 in C++ 14
#include <iostream>
struct A {
constexpr A(): i(5) {}
int&& f() { return std::move(i); }
int i;
} a;
A&& f(A& a) { return std::move(a); }
int main() {
A a;
int b[a.f()]{ 0, 1, 2, 3, 4 };
std::cout << b[4] << '\n';
}
Da §5.19/3 abbiamo:
Un'espressione costante intera è un'espressione integrale o tipo di enumerazione senza ambito, implicitamente convertito in un prvalue, dove convertito espressione è un'espressione costante di base. [Nota: Tali espressioni possono essere utilizzate come limiti di array (8.3.4, 5.3.4), come lunghezza del campo di bit (9.6), come inizializzatori di enumeratori se il tipo sottostante è non riparato (7.2) e come allineamenti (7.6.2). -end note]
L'espressione a.f()
è un'espressione di tipo integrale. Mi sembra (anche se ho bisogno di chiarimenti su questo punto) che questa espressione sia anche convertibile in un valore, perché è un valore x. Ma penso che il vero problema qui è che l'espressione a.f()
è non un'espressione costante di nucleo, in quanto soddisfa punto elenco (2.1) in § 5.19/2.
§5.19/2:
A condizionale espressione
e
è un nucleo espressione costante a meno che la valutazione die
, seguendo le regole della macchina astratta (1.9), sarebbe valutare una delle seguenti espressioni:(2.1) -
this
(5.1.1), eccetto in una funzioneconstexpr
o un costruttore constexpr che viene valutato come parte die
;
Se si prova a compilarlo con clang ++, si sottolinea che "gli array di dimensioni variabili non sono consentiti", quindi ho la sensazione che gcc non sia abbastanza pedante. –
Convincere GCC per far rispettare la conformità può essere un dolore. Ho trovato la compilazione con il flag '--pedantic-errors' sembra fare il trucco. Preferirei la stretta conformità come default e le bandiere per disattivare la conformità. – Galik
Questo sito abilita la modalità di conformità rigorosa sul compilatore (sono troppo pigro per capire quali script/siti di terze parti abilitare a vederlo da solo)? In caso contrario, il motivo è che g ++ ha un'estensione non standard per gli array di durata della memorizzazione automatica con dimensioni non costanti. – celtschk