Domyślna inicjalizacja składowych w C++11

0

Mam pytanie odnośnie nowego sposobu nadawania wartości domyślnych składowym klasy w C++11. Chodzi o tę metodę gdzie w definicji klasy nadajemy atrybutom wartości i jeśli lista inicjalizacyjna konstruktora nie zdefiniuje własnych to zostaną wykorzystane.
Przykładowo mamy:

class MojaKlasa {
     static const int LENGTH = 100;
     MojaKlasa() {} //Użyta zostanie wartość domyślna podana przy deklaracji składowej napis
     const char* napis = new char[LENGTH];
}

Teraz pora na pytanie. Z uwagi na to, że składowa statyczna LENGTH jest typu wbudowanego to mogę ją zainicjować wewnętrz definicji klasy. Ale pytanie czy mogę to jednak zrobić w pliku cpp nie narażając się na błędne działanie linijki

const char* napis = new char[LENGTH];

Wydaje mi się, że owa wartość domyślna to tylko taki "szablon" i faktycznie zostanie stworzona i wykorzystana dopiero przy konstrukcji jakiegoś obiektu, a wtedy wartość LENGTH będzie już znana. Przeniesienie więc inicjalizacji LENGTH to pliku cpp nie powinno więc nic popsuć. Ale są to tylko moje przypuszczenia i wolę się upewnić czy jest to legalne. Co na ten temat mówi standard?

0

odpal kompilator i sprawdz O.o

0

const char* napis = new char[LENGTH];
Nie jestem pewien, czy to przypadkiem nie podpada pod VLA (variable-length arrays). GCC i Clang to kompilują, ale one mają VLA. Visual 2012 tej linijki nie przełyka.

1
Azarien napisał(a):

const char* napis = new char[LENGTH];
Nie jestem pewien, czy to przypadkiem nie podpada pod VLA (variable-length arrays). GCC i Clang to kompilują, ale one mają VLA. Visual 2012 tej linijki nie przełyka.

VLA nie tworzy się operatorem new.

1

Wygląda ok. Standard mówi, że inicjalizacja statycznych stałych dzieje się przed innymi inicjalizacjami. A to, co stoi po prawej stronie przypisania stałych w definicji klas zostanie zewaluowane dopiero przy inicjalizacji klasy, można tam nawet this użyć. Konkretnych paragrafów ci nie podam, ale nie są trudne do znalezienia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1