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?

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.


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.


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 ++.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.