У меня вопрос относительно получения размера вектора во время компиляции в C++20. На основе C++20 можно создать во время компиляции вектор или строку в области действия функции.
Есть следующий фрагмент кода
#include
#include
#include
consteval auto copyVecToArray(){
std::vector vec{1,2,3,4,5,6,7};
std::array arr;
std::copy(std::begin(vec),std::end(vec),std::begin(arr));
return arr;
}
int main() {
constexpr auto value = copyVecToArray();
for(auto el : value){
std::cout 'vec.std::vector::size()'
> /opt/compiler-explorer/gcc-14.2.0/include/c++/14.2.0/bits/stl_vector.h:993:32:
> error: the value of 'vec' is not usable in a constant expression 993
> | { return size_type(this->_M_impl._M_finish -
> this->_M_impl._M_start); }
> | ~~~~~~^~~~~~~ :6:22: note: 'vec' was not declared 'constexpr'
> 6 | std::vector vec{1,2,3,4,5,6,7};
> | ^~~ :7:28: note: in template argument for type 'long unsigned int'
> 7 | std::array arr;
> | ~~~~~~~~^~ :8:55: error: no matching function for call to 'begin(int&)'
> 8 | std::copy(std::begin(vec),std::end(vec),std::begin(arr));
> |
Но если я немного изменю приведенный выше код и верну размер вектора из константной функции, это успешно скомпилируется.
У меня вопрос относительно получения размера вектора во время компиляции в C++20. На основе C++20 можно создать во время компиляции вектор или строку в области действия функции. Есть следующий фрагмент кода [code]#include #include #include
consteval auto copyVecToArray(){ std::vector vec{1,2,3,4,5,6,7}; std::array arr; std::copy(std::begin(vec),std::end(vec),std::begin(arr)); return arr; } int main() { constexpr auto value = copyVecToArray(); for(auto el : value){ std::cout 'vec.std::vector::size()' > /opt/compiler-explorer/gcc-14.2.0/include/c++/14.2.0/bits/stl_vector.h:993:32: > error: the value of 'vec' is not usable in a constant expression 993 > | { return size_type(this->_M_impl._M_finish - > this->_M_impl._M_start); } > | ~~~~~~^~~~~~~ :6:22: note: 'vec' was not declared 'constexpr' > 6 | std::vector vec{1,2,3,4,5,6,7}; > | ^~~ :7:28: note: in template argument for type 'long unsigned int' > 7 | std::array arr; > | ~~~~~~~~^~ :8:55: error: no matching function for call to 'begin(int&)' > 8 | std::copy(std::begin(vec),std::end(vec),std::begin(arr)); > | [/code] Но если я немного изменю приведенный выше код и верну размер вектора из константной функции, это успешно скомпилируется. [code]#include #include #include consteval auto getVec(){ std::vector vec{1,2,3,4,5,6,7}; return vec; } consteval auto getSize(){ return getVec().size(); } consteval auto copyVecToArray(){ std::array arr; auto vec = getVec(); std::copy(std::begin(vec),std::end(vec),std::begin(arr)); return arr; } int main() { constexpr auto value = copyVecToArray(); for(auto el : value){ std::cout