Ale kompiluje się w gcc 4.9.0. Zobacz live example:O ile wiem, ten kod nie powinien się kompilować, zgodnie z §5.19/3 i §5.19/2 w 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';
}
Od §5.19/3 mamy:
Integralną stała ekspresja jest wyrazem integralną lub unscoped typu wyliczenia, niejawnie konwertowane na prvalue, gdzie przekonwertowany wyrażenie jest stałym wyrażeniem stałym. [Uwaga: Takie wyrażenia mogą być używane jako ograniczenia tablicowe (8.3.4, 5.3.4), jako pola bitowe długości (9.6), jako inicjatory modułów wykonawczych, jeśli typ bazowy to , nie ustalony (7.2), oraz jako wyrównania (7.6.2). -end note]
Wyrażenie a.f()
jest wyrażeniem typu całkowego. Wydaje mi się (choć potrzebuję wyjaśnienia na ten temat), że wyrażenie to można również przekształcić na wartość, ponieważ jest to wartość x. Ale myślę, że prawdziwym problemem jest to, że wyrażenie a.f()
jest rdzennym wyrażeniem stałym, ponieważ spełnia punktor punktowy (2.1) w §5.19/2.
§5.19/2:
Warunkowe ekspresja
e
jest rdzeń stałym wyrażeniem ile ocenye
, kierując się zasadami abstrakcyjnej maszynie (1.9), by ocenić jedną z następujących wyrażenia:(2,1) -
this
(5.1.1), z wyjątkiem funkcjiconstexpr
lub konstruktora constexpr, który jest przetwarzany w ramache
;
Jeśli spróbujesz skompilować to z kodem ++, to wskazuje, że "tablice o zmiennych rozmiarach są niedozwolone" - więc mam wrażenie, że gcc po prostu nie jest wystarczająco pedantyczny. –
Przekonanie GCC do egzekwowania zgodności może być uciążliwe. Stwierdziłem, że kompilowanie z flagą '--pedantic-errors' wydaje się działać. Preferuję ścisłą zgodność jako domyślną i flagi do wyłączenia zgodności. – Galik
Czy ta witryna włącza ścisły tryb zgodności w kompilatorze (jestem zbyt leniwy, aby dowiedzieć się, jakie skrypty/witryny stron trzecich umożliwiają zobaczenie tego dla siebie)? Jeśli nie, powodem jest to, że g ++ ma niestandardowe rozszerzenie dla macierzy czasu automatycznego przechowywania o niestałym rozmiarze. – celtschk