#include <iostream>
#include <array>
int main(int argc, char **argv) {
constexpr const std::array<int, 2> arr {{ 0, 1 }};
constexpr const int arr2[] = { 0, 1};
static_assert(arr[0] == arr2[0], "asdf");
static_assert(arr[1] == arr2[1], "asdfasdf");
return 0;
}
quando viene compilato con gcc 4.8.2
e 4.9.1
utilizzando g++ test.cpp --std=c++11
, la compilazione riesce. quando si compila con clang 3.4
e 3.5
utilizzando clang++ test.cpp --std=c++11
tuttavia, la compilazione fallisce:constexpr std :: array con static_assert
test.cpp:8:16: error: static_assert expression is not an integral constant expression
static_assert(arr[0] == arr2[0], "asdf");
^~~~~~~~~~~~~~~~~
test.cpp:8:16: note: non-constexpr function 'operator[]' cannot be used in a constant expression
Quindi la mia domanda è, quale compilatore è "giusto" nel senso di essere compatibile con C++ 11? E, se clang
è corretto, allora perché lo standard std :: array operator[]
non supporta constexpr? Non è forse una delle cose che lo std::array
avrebbe dovuto aiutare a risolvere?
In C++ 11, è diventato possibile dichiarare 'array :: operator [] const' come' constexpr', ma il comitato non è riuscito a farlo fino a C++ 14. In C++ 14, è diventato possibile dichiarare 'array :: operator []' come 'constexpr' ... – Casey
@Casey Ho trovato il documento che ha introdotto la modifica in' N3485', l'ho aggiunto alla mia risposta. Per quanto ho capito se fosse considerato un difetto dovrebbe essere permesso in modalità C++ 11, ma per il resto no. Il documento non chiarisce questo però. –
Principalmente mi sono divertito allo standard: le modifiche alle librerie sono spesso in ritardo rispetto al core, perché al core piace apportare modifiche all'ultimo minuto senza fornire alla biblioteca il tempo sufficiente per reagire. Credo che le aggiunte di 'constexpr' in N3470 siano un miglioramento, dal momento che l'unico rapporto sui difetti per' array' che implica 'constexpr' è [LWG DR 720] (http://www.open-std.org/jtc1/sc22 /wg21/docs/lwg-defects.html#720), e non coinvolge 'operator []'. – Casey