Mogę zdefiniować długość tablicy za pomocą stałej, więc dlaczego int d [b] nie działa?

11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

Definicja f[c]jest poprawna.
Zmienna bjest również stała int, ale kompilator dał mi błąd „wyrażenie musi mieć stałą wartość” dla wiersza int d[b]. Jakie są różnice między bi c?

OliverShang
źródło

Odpowiedzi:

16

jakie są różnice między b i c?

c ma inicjalizator stałej czasowej kompilacji, a b nie. Obiekt stały z inicjatorem stałej czasowej kompilacji sam w sobie jest wartością stałą czasową kompilacji.

Ponieważ mogę zdefiniować jedną dziesiątą arry za pomocą stałej, więc dlaczego to nie działa?

Nie wystarczy żadna stała. constKwalifikator oznacza trwałość środowiska wykonawczego (tj. wartość można określić w czasie wykonywania, ale nie zmieni się ona przez cały okres istnienia obiektu). Jako rozmiar tablicy można użyć tylko stałych stałych kompilacji.

eerorika
źródło
6

Używasz zmiennej innej niż stała, aby przypisać wartość do stałej. Dlatego wartości tej zmiennej nie można określić czasu kompilacji . Wiem, że się nie zmieniasz a, ale kompilator tak nie myśli.

CoderCharmander
źródło
4

Diagnostyka kompilatora powinna naprawdę być stałym wyrażeniem możliwym do oszacowania w czasie kompilacji .

Ponieważ oryginalny obiekt, do którego bjest przypisany const, bnie jest stałym wyrażeniem, które można oszacować w czasie kompilacji, kompilacja zakończy się niepowodzeniem, ponieważ tablice o zmiennej długości nie są obsługiwane w standardowym języku C ++.

Batszeba
źródło
1

„Const” oznacza po prostu tylko, że zmienna nie zmieni się w czasie wykonywania i nie oznacza, że ​​jej wartość można wywnioskować w czasie kompilacji.

Myślę, że to, czego szukasz, to „constexpr”. Może możesz to wypróbować w następujący sposób:

constexpr int b = 4; // can't be assigned from a!
int d[b];

„Constexpr” oznacza zamiast tego „prawdziwy const”, a „const” oznacza tylko „niezmienny var”, ponieważ z jakiegoś powodu historycznego. Należy pamiętać, że natywna tablica w c ++ zawsze ma stałą długość, jak powiedział @Bathsheba.

Leon
źródło
O jakich „innych językach” mówisz?
Brian
1
@Brian Przepraszamy, to nie ma znaczenia. Zmieniłem odpowiedź.
Leon
„Brak prawdziwego szkota ...” - nie zgadzam się z twoim „constexpr” zamiast tego oznacza „prawdziwy const”, a „const” oznacza tylko „niezmienną zmienną var” . „const” oznacza „const”, „constexpr” oznacza „constexpr” - mają dwa różne znaczenia i implikacje w kontekście języka c ++. „const” oznacza „Obiekt nie może być modyfikowany” , „constexpr” oznacza „możliwe jest oszacowanie wartości funkcji lub zmiennej w czasie kompilacji”
CharonX
Przepraszam, może źle to wyraziłem. Angielski nie jest moim językiem ojczystym.
Leon
1

Termin „stały” jest naprawdę niejednoznaczny, a słowo kluczowe constwprowadza w błąd.

constoznacza: „nie zezwalaj, aby wartość tego obiektu nie uległa zmianie po inicjalizacji”. To nie nie oznacza „stałą czasu kompilacji”. Jego początkowa wartość może (i zwykle ma) nadal pochodzić ze źródeł wykonawczych.

Potrzebujesz stałej czasowej kompilacji związanej z tablicą.

Czasami możliwe jest posiadanie nazwanego obiektu, fooktóry jest stałą czasową kompilacji, jeśli tak jest const i został zainicjowany ze stałego wyrażenia, takiego jak literał lub constexprrzecz. Tak jest w przypadku c; tak nie jest b.

Lekkość Wyścigi na orbicie
źródło