Я набивал некоторые значения в constexpr std::array
, а затем продолжал статическую добротность времени компиляции в значениях constexpr
, когда обнаружил, что вы не можете использовать элемент как инициализатор constexpr
в С++ 11.
Это потому, что std::array::operator[]
на самом деле не отмечен constexpr
, пока С++ 14: qaru.site/info/195911/...
После обновления флага компилятора я могу теперь использовать элемент constexpr std::array
как значение constexpr
:
#include <array>
constexpr std::array<int, 1> array{{3}};
// Initialize a constexpr from an array member through its const operator[]
// that (maybe?) returns a const int & and is constexpr
constexpr int a = array[0]; // Works in >=C++14 but not in C++11
Но иногда я хочу использовать временный массив в вычислении constexpr
, и это не работает.
// Initialize a constexpr from a temporary
constexpr int b = std::array<int, 1>{{3}}[0]; // Doesn't work!
Я получаю это от clang++ 3.6 с -std = С++ 14:
prog.cc:9:15: error: constexpr variable 'b' must be initialized by a constant expression
constexpr int b = std::array<int, 1>{{3}}[0]; // Doesn't work!
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cc:9:19: note: non-constexpr function 'operator[]' cannot be used in a constant expression
constexpr int b = std::array<int, 1>{{3}}[0]; // Doesn't work!
^
/usr/local/libcxx-3.5/include/c++/v1/array:183:41: note: declared here
_LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];}
^
1 error generated.
В чем разница между двумя переменными, в которые я индексирую? Почему я не могу использовать временно инициализированный временный std::array
operator[]
как constexpr
?