Powiedzmy mam funkcji, takich jak:size() stanowi wskaźnik std :: tablicy w kontekście constexpr
int test(std::array<char, 8>* data) {
char buffer[data->size() * 2];
[... some code ...]
}
wyraźnie wielkość bufora można ocenić w czasie kompilacji: Dane posiada constexpr
rozmiar 8 elementy, 8 * 2 = 16 bajtów.
Jednak podczas kompilacji z -Wall
, -pedantic
i -std=c++11
uzyskać niesławny błąd:
warning: variable length arrays are a C99 feature [-Wvla-extension]
które wierzę sens: array::size()
jest constexpr
, ale nadal jest to metoda, w funkcji powyżej my nadal trzeba wyłuskać wskaźnik, który nie jest constexpr
.
Gdy próbuję coś takiego:
int test(std::array<char, 8>& data) {
char buffer[data.size() * 2];
[...]
}
gcc
(wersja 5.2.0 próbowałem) wydaje się szczęśliwy: nie ma ostrzeżenia.
Ale z clang++
(3.5.1) nadal otrzymuję ostrzeżenie narzekające na tablice o zmiennej długości.
W moim przypadku nie mogę łatwo zmienić podpisu test
, musi on przyjąć wskaźnik. Więc ... kilka pytań:
Jaki jest najlepszy/najbardziej standardowy sposób, aby uzyskać rozmiar
std::array
wskaźnik w constexpr kontekście?Czy różnica w zachowaniu jest oczekiwana w przypadku wskaźników i odniesień? Który kompilator ma rację co do ostrzeżenia,
gcc
lubclang
?
Byłoby interesujące dowiedzieć się dlaczego 'size' nie jest statyczna funkcja członek .. – dyp
Powinienem też dodać, że nie ma chyba jakiś sposób, aby uzyskać rozmiar za pomocą szablonu, coś jak: ' szablon std :: size_t arraysize (const std :: array i array) {return N; } ' , którego można użyć powyżej. Nadal ... czy to właściwa droga? Wydaje się wykrzywiony. –
rabexc
Mogłem zobaczyć, że zawodzi w przypadku wskaźnika, ale nie w przypadku odniesienia, ponieważ technicznie, wskaźnik może być "nullptr"; z pewnością nie może w nim nic przydatnego, ale oznacza także, że "rozmiar" nie jest poprawnie zdefiniowany. Jeśli "rozmiar" byłby wirtualny, mógłbym zobaczyć, że narzeka on zarówno na wskaźniki, jak i referencje (ponieważ może to być typ pochodzący od 'std :: array', który nie ma tej samej implementacji 'size', ale to wyraźnie nie jest sprawa tutaj. –
ShadowRanger