Sebelum C ++ 11, kita hanya dapat melakukan inisialisasi di dalam kelas pada anggota const statis integral atau tipe enumerasi. Stroustrup membahas hal ini dalam C ++ FAQ-nya , memberikan contoh berikut:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
Dan alasan berikut:
Jadi mengapa ada batasan yang tidak nyaman ini? Kelas biasanya dideklarasikan dalam file header dan file header biasanya disertakan ke dalam banyak unit terjemahan. Namun, untuk menghindari aturan linker yang rumit, C ++ mengharuskan setiap objek memiliki definisi yang unik. Aturan itu akan rusak jika C ++ mengizinkan definisi entitas di kelas yang perlu disimpan dalam memori sebagai objek.
Namun, C ++ 11 melonggarkan pembatasan ini, memungkinkan inisialisasi anggota non-statis di kelas (§12.6.2 / 8):
Dalam konstruktor non-delegasi, jika anggota data non-statis atau kelas dasar tertentu tidak ditetapkan oleh mem-initializer-id (termasuk kasus di mana tidak ada mem-initializer-list karena konstruktor tidak memiliki ctor-initializer ) dan entitas tersebut bukan kelas basis virtual dari kelas abstrak (10.4), maka
- jika entitas adalah anggota data non-statis yang memiliki penginisialisasi brace-or-equal , entitas diinisialisasi seperti yang ditentukan dalam 8.5;
- sebaliknya, jika entitas adalah anggota varian (9.5), tidak ada inisialisasi yang dilakukan;
- jika tidak, entitas diinisialisasi secara default (8.5).
Bagian 9.4.2 juga memungkinkan inisialisasi di dalam kelas dari anggota statis non-const jika mereka ditandai dengan constexpr
penentu.
Jadi apa yang terjadi dengan alasan pembatasan yang kami miliki di C ++ 03? Apakah kita hanya menerima "aturan linker yang rumit" atau ada perubahan lain yang membuat ini lebih mudah untuk diterapkan?