В приведенном ниже коде я возвращаю 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
Компилируется при возврате неконстантного std::vector, но завершается с ошибкой при возврате const std::vector ⇐ C++
Программы на C++. Форум разработчиков
1763487176
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79823209/compiles-when-returning-a-non-const-stdvector-but-fails-when-returning-a-const[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия