Saya bisa mendefinisikan panjang array menggunakan konstanta, jadi mengapa tidak d [b] bekerja?

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

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

Definisi f[c]valid.
Variabelnya bjuga konstan int, tetapi kompiler memberi saya kesalahan "ekspresi harus memiliki nilai konstan" untuk baris int d[b]. Apa perbedaan antara bdan c?

OliverShang
sumber

Jawaban:

16

apa perbedaan antara b dan c?

c memiliki initializer konstanta waktu kompilasi, sedangkan b tidak. Objek const dengan initializer konstanta waktu kompilasi itu sendiri merupakan nilai konstanta waktu kompilasi.

Karena saya dapat mendefinisikan satu lentry dari sebuah arry menggunakan konstanta, jadi mengapa ini tidak berhasil?

Bukan sembarang konstanta yang bisa dilakukan. constqualifier mengimplikasikan runtime constness (yaitu nilai dapat ditentukan pada saat runtime tetapi tidak akan berubah sepanjang umur objek). Hanya nilai konstanta waktu kompilasi yang dapat digunakan sebagai ukuran array.

eerorika
sumber
6

Anda menggunakan variabel tidak konstan untuk menetapkan nilai ke konstanta. Oleh karena itu, nilai variabel itu tidak dapat ditentukan waktu kompilasi . Saya tahu Anda tidak berubah a, tetapi kompiler tidak berpikir seperti ini.

CoderCharmander
sumber
4

Diagnostik kompiler harus benar-benar menyusun waktu ekspresi konstan yang dapat dievaluasi .

Karena objek asli yang bditugaskan tidak const, bbukan ekspresi konstanta waktu kompilasi yang dapat dievaluasi, jadi kompilasi akan gagal karena array panjang variabel tidak didukung dalam standar C ++.

Batsyeba
sumber
1

"Const" hanya berarti bahwa variabel tidak akan berubah pada saat run time, dan tidak berarti bahwa nilainya dapat disimpulkan pada waktu kompilasi.

Saya kira yang Anda cari adalah "constexpr". Mungkin Anda bisa mencobanya seperti ini:

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

"Constexpr" sebaliknya berarti "const nyata" dan "const" hanya berarti "var yang tidak berubah", karena beberapa alasan historis. Harus diingat bahwa array asli di c ++ selalu diperbaiki-panjang seperti kata @Bathsheba.

Leon
sumber
"Bahasa lain" apa yang Anda bicarakan?
Brian
1
@ Brian Maaf, ini tidak relevan. Saya mengubah jawaban saya.
Leon
"Tidak ada penulis Skotlandia sejati ..." - izinkan saya tidak setuju dengan "constexpr" Anda sebagai gantinya berarti "const nyata" dan "const" hanya berarti pernyataan "var yang tidak berubah" . "const" berarti "const", "constexpr" berarti "constexpr" - mereka memiliki dua arti dan implikasi berbeda dalam konteks bahasa c ++. "const" berarti "Obyek tidak dapat dimodifikasi" , "constexpr" berarti "adalah mungkin untuk mengevaluasi nilai fungsi atau variabel pada waktu kompilasi"
CharonX
Maaf, mungkin saya salah mengutarakannya. Bahasa Inggris bukan bahasa ibu saya.
Leon
1

Istilah "konstan" benar-benar ambigu, dan kata kunci consttersebut menyesatkan.

constberarti: "jangan izinkan nilai objek ini tidak akan berubah setelah inisialisasi". Itu tidak berarti "kompilasi waktu konstan". Nilai awalnya dapat (dan biasanya memang) masih berasal dari sumber runtime.

Anda memerlukan konstanta waktu kompilasi untuk batas array.

Kadang-kadang mungkin untuk memiliki objek bernama fookonstanta waktu kompilasi, jika itu const dan itu diinisialisasi dari ekspresi konstan, seperti literal atau constexprbenda. Itulah masalahnya c; tidak demikian halnya untuk b.

Lightness Races di Orbit
sumber