Время компиляции C++20 извлекает размер вектораC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Время компиляции C++20 извлекает размер вектора

Сообщение Anonymous »

У меня вопрос относительно получения размера вектора во время компиляции в 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));
>       |
Но если я немного изменю приведенный выше код и верну размер вектора из константной функции, это успешно скомпилируется.

Код: Выделить всё

#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 

Подробнее здесь: [url]https://stackoverflow.com/questions/79328691/c20-compile-time-retrieve-size-of-a-vector[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»