Компилируется при возврате неконстантного std::vector, но завершается с ошибкой при возврате const std::vectorC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Компилируется при возврате неконстантного std::vector, но завершается с ошибкой при возврате const std::vector

Сообщение Anonymous »

В приведенном ниже коде я возвращаю std::vector из функции get. Если я сделаю std::vector типом const, компиляция завершится неудачей, в противном случае она пройдет. Может кто-нибудь объяснить такое поведение
#include
#include
#include
#include

class A {
public:
A() = default;
~A() = default;
A(A&&) = default;
A& operator=(A&&) = default;
};

std::vector get() {
std::vector a(3);
auto v = std::views::take(a, 3);

// removing below const, the program compiles successfully
const std::vector b(
std::make_move_iterator(std::begin(v)),
std::make_move_iterator(std::end(v)));

return b;
}

int main() {
const std::vector b = get();

std::cout _M_impl._M_start,
| ~~~~~~~~~~~~~~~~~~~~~~~
638 | _M_get_Tp_allocator());
| ~~~~~~~~~~~~~~~~~~~~~~
:21:12: required from here
21 | return b;
| ^
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:129:28: error: no matching function for call to 'construct_at(A*&, const A&)'
129 | std::construct_at(__p, std::forward(__args)...);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:129:28: note: there is 1 candidate
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:96:5: note: candidate 1: 'template requires !(is_unbounded_array_v) && requires{::new(void*(0)) _Tp;} constexpr _Tp* std::construct_at(_Tp*, _Args&& ...)'
96 | construct_at(_Tp* __location, _Args&&... __args)
| ^~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:96:5: note: template argument deduction/substitution failed:
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:96:5: note: constraints not satisfied
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h: In substitution of 'template requires !(is_unbounded_array_v) && requires{::new(void*(0)) _Tp;} constexpr _Tp* std::construct_at(_Tp*, _Args&& ...) [with _Tp = A; _Args = {const A&}]':
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:129:21: required from 'constexpr void std::_Construct(_Tp*, _Args&& ...) [with _Tp = A; _Args = {const A&}]'
129 | std::construct_at(__p, std::forward(__args)...);
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_uninitialized.h:145:17: required from 'constexpr _ForwardIterator std::__do_uninit_copy(_InputIterator, _Sentinel, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator; _Sentinel = __gnu_cxx::__normal_iterator; _ForwardIterator = A*]'
145 | std::_Construct(std::__addressof(*__result), *__first);
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_uninitialized.h:618:30: required from 'constexpr _ForwardIterator std::__uninitialized_copy_a(_InputIterator, _Sentinel, _ForwardIterator, allocator&) [with _InputIterator = __gnu_cxx::__normal_iterator; _Sentinel = __gnu_cxx::__normal_iterator; _ForwardIterator = A*; _Tp = A]'
618 | return std::__do_uninit_copy(std::move(__first), __last, __result);
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_vector.h:636:31: required from 'constexpr std::vector< , >::vector(const std::vector< , >&) [with _Tp = A; _Alloc = std::allocator]'
636 | std::__uninitialized_copy_a(__x.begin(), __x.end(),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
637 | this->_M_impl._M_start,
| ~~~~~~~~~~~~~~~~~~~~~~~
638 | _M_get_Tp_allocator());
| ~~~~~~~~~~~~~~~~~~~~~~
:21:12: required from here
21 | return b;
| ^
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:96:5: required by the constraints of 'template requires !(is_unbounded_array_v) && requires{::new(void*(0)) _Tp;} constexpr _Tp* std::construct_at(_Tp*, _Args&& ...)'
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:94:10: in requirements [with _Tp = A; _Args = {const A&}]
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:94:21: note: the required expression '::new(void*(0)) _Tp' is invalid
94 | && requires { ::new((void*)0) _Tp(std::declval()...); }
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h: In instantiation of 'constexpr void std::_Construct(_Tp*, _Args&& ...) [with _Tp = A; _Args = {const A&}]':
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_uninitialized.h:145:17: required from 'constexpr _ForwardIterator std::__do_uninit_copy(_InputIterator, _Sentinel, _ForwardIterator) [with _InputIterator = __gnu_cxx::__normal_iterator; _Sentinel = __gnu_cxx::__normal_iterator; _ForwardIterator = A*]'
145 | std::_Construct(std::__addressof(*__result), *__first);
| ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_uninitialized.h:618:30: required from 'constexpr _ForwardIterator std::__uninitialized_copy_a(_InputIterator, _Sentinel, _ForwardIterator, allocator&) [with _InputIterator = __gnu_cxx::__normal_iterator; _Sentinel = __gnu_cxx::__normal_iterator; _ForwardIterator = A*; _Tp = A]'
618 | return std::__do_uninit_copy(std::move(__first), __last, __result);
| ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_vector.h:636:31: required from 'constexpr std::vector< , >::vector(const std::vector< , >&) [with _Tp = A; _Alloc = std::allocator]'
636 | std::__uninitialized_copy_a(__x.begin(), __x.end(),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
637 | this->_M_impl._M_start,
| ~~~~~~~~~~~~~~~~~~~~~~~
638 | _M_get_Tp_allocator());
| ~~~~~~~~~~~~~~~~~~~~~~
:21:12: required from here
21 | return b;
| ^
cc1plus: note: set '-fconcepts-diagnostics-depth=' to at least 2 for more detail
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:133:7: error: use of deleted function 'constexpr A::A(const A&)'
133 | ::new(static_cast(__p)) _Tp(std::forward(__args)...);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:6:7: note: 'constexpr A::A(const A&)' is implicitly declared as deleted because 'A' declares a move constructor or move assignment operator
6 | class A {
| ^
/cefs/22/22e6cdc013c8541ce3d1548e_consolidated/compilers_c++_x86_gcc_15.2.0/include/c++/15.2.0/bits/stl_construct.h:133:7: note: use '-fdiagnostics-all-candidates' to display considered candidates
133 | ::new(static_cast(__p)) _Tp(std::forward(__args)...);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compiler returned: 1


Подробнее здесь: https://stackoverflow.com/questions/798 ... ng-a-const
Ответить

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

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

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

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

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