https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91807
Bug ID: 91807 Summary: [Regression] std::variant with multiple identical types assignment fail Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: raplonu.jb at gmail dot com Target Milestone: --- Created attachment 46895 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46895&action=edit preprocessed file Repro: #include <variant> struct me_data { me_data() = default; me_data(const me_data &) {}; me_data(me_data &&) noexcept {}; me_data& operator=(const me_data &) = default; }; int main() { std::variant<me_data, me_data> v1, v2; v2 = v1; } Compiles with 8. Breaks with 9 (see bellow) and 10.0.0 201 (on wandbox : https://wandbox.org/permlink/3GZeJzWMlElIgqGd ): In file included from main.cpp:1: /usr/include/c++/9/variant: In instantiation of ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)> mutable [with auto:3 = const me_data&; auto:4 = std::integral_constant<long unsigned int, 0>]’: /usr/include/c++/9/bits/invoke.h:60:36: required from ‘constexpr _Res std::__invoke_impl(std::__invoke_other, _Fn&&, _Args&& ...) [with _Res = std::__detail::__variant::__variant_idx_cookie; _Fn = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 0>}]’ /usr/include/c++/9/bits/invoke.h:95:40: required from ‘constexpr typename std::__invoke_result<_Functor, _ArgTypes>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 0>}; typename std::__invoke_result<_Functor, _ArgTypes>::type = std::__detail::__variant::__variant_idx_cookie]’ /usr/include/c++/9/variant:961:24: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke_impl(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:980:28: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__do_visit_invoke(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:996:28: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:1005:28: required from ‘static constexpr auto std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply() [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:915:56: required from ‘static constexpr void std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply_single_alt(_Tp&, _Tp*) [with bool __do_cookie = true; long unsigned int __index = 0; _Tp = std::__detail::__variant::_Multi_array<std::__detail::__variant::__variant_idx_cookie (*)(std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&)>; bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; long unsigned int ...__dimensions = {2}; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {}]’ /usr/include/c++/9/variant:896:47: required from ‘constexpr const _Array_type std::__detail::__variant::__gen_vtable<true, std::__detail::__variant::__variant_idx_cookie, std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&>::_S_vtable’ /usr/include/c++/9/variant:1638:23: required from ‘constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with bool __use_index = true; bool __same_return_types = true; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Variants = {const std::variant<me_data, me_data>&}]’ /usr/include/c++/9/variant:586:32: required from ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>& std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]’ /usr/include/c++/9/variant:636:12: required from here /usr/include/c++/9/variant:609:6: error: no matching function for call to ‘std::variant<me_data, me_data>::variant(const me_data&)’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1342:2: note: candidate: ‘template<long unsigned int _Np, class _Up, class ... _Args, class _Tp, class> constexpr std::variant<_Types>::variant(std::in_place_index_t<_Np>, std::initializer_list<_Up>, _Args&& ...)’ 1342 | variant(in_place_index_t<_Np>, initializer_list<_Up> __il, | ^~~~~~~ /usr/include/c++/9/variant:1342:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_index_t<_Idx>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1331:2: note: candidate: ‘template<long unsigned int _Np, class ... _Args, class _Tp, class> constexpr std::variant<_Types>::variant(std::in_place_index_t<_Np>, _Args&& ...)’ 1331 | variant(in_place_index_t<_Np>, _Args&&... __args) | ^~~~~~~ /usr/include/c++/9/variant:1331:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_index_t<_Idx>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1321:2: note: candidate: ‘template<class _Tp, class _Up, class ... _Args, class> constexpr std::variant<_Types>::variant(std::in_place_type_t<_Tp>, std::initializer_list<_Up>, _Args&& ...)’ 1321 | variant(in_place_type_t<_Tp>, initializer_list<_Up> __il, | ^~~~~~~ /usr/include/c++/9/variant:1321:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_type_t<_Tp>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1311:2: note: candidate: ‘template<class _Tp, class ... _Args, class> constexpr std::variant<_Types>::variant(std::in_place_type_t<_Tp>, _Args&& ...)’ 1311 | variant(in_place_type_t<_Tp>, _Args&&... __args) | ^~~~~~~ /usr/include/c++/9/variant:1311:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_type_t<_Tp>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1301:2: note: candidate: ‘template<class _Tp, class, class, class _Tj, class> constexpr std::variant<_Types>::variant(_Tp&&)’ 1301 | variant(_Tp&& __t) | ^~~~~~~ /usr/include/c++/9/variant:1301:2: note: template argument deduction/substitution failed: In file included from /usr/include/c++/9/variant:36, from main.cpp:1: /usr/include/c++/9/type_traits: In substitution of ‘template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = (((bool)std::variant<me_data, me_data>::__exactly_once<me_data>) && ((bool)std::is_constructible_v<me_data, const me_data&>)); _Tp = void]’: /usr/include/c++/9/variant:1298:9: required from ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)> mutable [with auto:3 = const me_data&; auto:4 = std::integral_constant<long unsigned int, 0>]’ /usr/include/c++/9/bits/invoke.h:60:36: required from ‘constexpr _Res std::__invoke_impl(std::__invoke_other, _Fn&&, _Args&& ...) [with _Res = std::__detail::__variant::__variant_idx_cookie; _Fn = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 0>}]’ /usr/include/c++/9/bits/invoke.h:95:40: required from ‘constexpr typename std::__invoke_result<_Functor, _ArgTypes>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 0>}; typename std::__invoke_result<_Functor, _ArgTypes>::type = std::__detail::__variant::__variant_idx_cookie]’ /usr/include/c++/9/variant:961:24: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke_impl(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:980:28: [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ] /usr/include/c++/9/variant:1005:28: required from ‘static constexpr auto std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply() [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:915:56: required from ‘static constexpr void std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply_single_alt(_Tp&, _Tp*) [with bool __do_cookie = true; long unsigned int __index = 0; _Tp = std::__detail::__variant::_Multi_array<std::__detail::__variant::__variant_idx_cookie (*)(std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&)>; bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; long unsigned int ...__dimensions = {2}; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {}]’ /usr/include/c++/9/variant:896:47: required from ‘constexpr const _Array_type std::__detail::__variant::__gen_vtable<true, std::__detail::__variant::__variant_idx_cookie, std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&>::_S_vtable’ /usr/include/c++/9/variant:1638:23: required from ‘constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with bool __use_index = true; bool __same_return_types = true; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Variants = {const std::variant<me_data, me_data>&}]’ /usr/include/c++/9/variant:586:32: required from ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>& std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]’ /usr/include/c++/9/variant:636:12: required from here /usr/include/c++/9/type_traits:2384:11: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’ 2384 | using enable_if_t = typename enable_if<_Cond, _Tp>::type; | ^~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant: In instantiation of ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)> mutable [with auto:3 = const me_data&; auto:4 = std::integral_constant<long unsigned int, 0>]’: /usr/include/c++/9/bits/invoke.h:60:36: required from ‘constexpr _Res std::__invoke_impl(std::__invoke_other, _Fn&&, _Args&& ...) [with _Res = std::__detail::__variant::__variant_idx_cookie; _Fn = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 0>}]’ /usr/include/c++/9/bits/invoke.h:95:40: required from ‘constexpr typename std::__invoke_result<_Functor, _ArgTypes>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 0>}; typename std::__invoke_result<_Functor, _ArgTypes>::type = std::__detail::__variant::__variant_idx_cookie]’ /usr/include/c++/9/variant:961:24: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke_impl(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:980:28: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__do_visit_invoke(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:996:28: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:1005:28: required from ‘static constexpr auto std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply() [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {0}]’ /usr/include/c++/9/variant:915:56: required from ‘static constexpr void std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply_single_alt(_Tp&, _Tp*) [with bool __do_cookie = true; long unsigned int __index = 0; _Tp = std::__detail::__variant::_Multi_array<std::__detail::__variant::__variant_idx_cookie (*)(std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&)>; bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; long unsigned int ...__dimensions = {2}; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {}]’ /usr/include/c++/9/variant:896:47: required from ‘constexpr const _Array_type std::__detail::__variant::__gen_vtable<true, std::__detail::__variant::__variant_idx_cookie, std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&>::_S_vtable’ /usr/include/c++/9/variant:1638:23: required from ‘constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with bool __use_index = true; bool __same_return_types = true; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Variants = {const std::variant<me_data, me_data>&}]’ /usr/include/c++/9/variant:586:32: required from ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>& std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]’ /usr/include/c++/9/variant:636:12: required from here /usr/include/c++/9/variant:1289:7: note: candidate: ‘std::variant<_Types>::variant(std::variant<_Types>&&) [with _Types = {me_data, me_data}]’ 1289 | variant(variant&&) = default; | ^~~~~~~ /usr/include/c++/9/variant:1289:15: note: no known conversion for argument 1 from ‘const me_data’ to ‘std::variant<me_data, me_data>&&’ 1289 | variant(variant&&) = default; | ^~~~~~~~~ /usr/include/c++/9/variant:1288:7: note: candidate: ‘std::variant<_Types>::variant(const std::variant<_Types>&) [with _Types = {me_data, me_data}]’ 1288 | variant(const variant& __rhs) = default; | ^~~~~~~ /usr/include/c++/9/variant:1288:30: note: no known conversion for argument 1 from ‘const me_data’ to ‘const std::variant<me_data, me_data>&’ 1288 | variant(const variant& __rhs) = default; | ~~~~~~~~~~~~~~~^~~~~ /usr/include/c++/9/variant:1287:7: note: candidate: ‘constexpr std::variant<_Types>::variant() [with _Types = {me_data, me_data}]’ 1287 | variant() = default; | ^~~~~~~ /usr/include/c++/9/variant:1287:7: note: candidate expects 0 arguments, 1 provided In file included from main.cpp:1: /usr/include/c++/9/variant: In instantiation of ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)> mutable [with auto:3 = const me_data&; auto:4 = std::integral_constant<long unsigned int, 1>]’: /usr/include/c++/9/bits/invoke.h:60:36: required from ‘constexpr _Res std::__invoke_impl(std::__invoke_other, _Fn&&, _Args&& ...) [with _Res = std::__detail::__variant::__variant_idx_cookie; _Fn = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 1>}]’ /usr/include/c++/9/bits/invoke.h:95:40: required from ‘constexpr typename std::__invoke_result<_Functor, _ArgTypes>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Args = {const me_data&, std::integral_constant<long unsigned int, 1>}; typename std::__invoke_result<_Functor, _ArgTypes>::type = std::__detail::__variant::__variant_idx_cookie]’ /usr/include/c++/9/variant:961:24: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke_impl(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {1}]’ /usr/include/c++/9/variant:980:28: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__do_visit_invoke(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {1}]’ /usr/include/c++/9/variant:996:28: required from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke(_Visitor&&, _Variants ...) [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {1}]’ /usr/include/c++/9/variant:1005:28: required from ‘static constexpr auto std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply() [with bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {1}]’ /usr/include/c++/9/variant:915:56: required from ‘static constexpr void std::__detail::__variant::__gen_vtable_impl<__same_return_types, std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply_single_alt(_Tp&, _Tp*) [with bool __do_cookie = true; long unsigned int __index = 1; _Tp = std::__detail::__variant::_Multi_array<std::__detail::__variant::__variant_idx_cookie (*)(std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&)>; bool __same_return_types = true; _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&; long unsigned int ...__dimensions = {2}; _Variants = {const std::variant<me_data, me_data>&}; long unsigned int ...__indices = {}]’ /usr/include/c++/9/variant:896:47: required from ‘constexpr const _Array_type std::__detail::__variant::__gen_vtable<true, std::__detail::__variant::__variant_idx_cookie, std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>&&, const std::variant<me_data, me_data>&>::_S_vtable’ /usr/include/c++/9/variant:1638:23: required from ‘constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with bool __use_index = true; bool __same_return_types = true; _Visitor = std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]::<lambda(auto:3&&, auto:4)>; _Variants = {const std::variant<me_data, me_data>&}]’ /usr/include/c++/9/variant:586:32: required from ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>& std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::operator=(const std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&) [with bool <anonymous> = false; _Types = {me_data, me_data}]’ /usr/include/c++/9/variant:636:12: required from here /usr/include/c++/9/variant:609:6: error: no matching function for call to ‘std::variant<me_data, me_data>::variant(const me_data&)’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1342:2: note: candidate: ‘template<long unsigned int _Np, class _Up, class ... _Args, class _Tp, class> constexpr std::variant<_Types>::variant(std::in_place_index_t<_Np>, std::initializer_list<_Up>, _Args&& ...)’ 1342 | variant(in_place_index_t<_Np>, initializer_list<_Up> __il, | ^~~~~~~ /usr/include/c++/9/variant:1342:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_index_t<_Idx>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1331:2: note: candidate: ‘template<long unsigned int _Np, class ... _Args, class _Tp, class> constexpr std::variant<_Types>::variant(std::in_place_index_t<_Np>, _Args&& ...)’ 1331 | variant(in_place_index_t<_Np>, _Args&&... __args) | ^~~~~~~ /usr/include/c++/9/variant:1331:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_index_t<_Idx>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1321:2: note: candidate: ‘template<class _Tp, class _Up, class ... _Args, class> constexpr std::variant<_Types>::variant(std::in_place_type_t<_Tp>, std::initializer_list<_Up>, _Args&& ...)’ 1321 | variant(in_place_type_t<_Tp>, initializer_list<_Up> __il, | ^~~~~~~ /usr/include/c++/9/variant:1321:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_type_t<_Tp>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1311:2: note: candidate: ‘template<class _Tp, class ... _Args, class> constexpr std::variant<_Types>::variant(std::in_place_type_t<_Tp>, _Args&& ...)’ 1311 | variant(in_place_type_t<_Tp>, _Args&&... __args) | ^~~~~~~ /usr/include/c++/9/variant:1311:2: note: template argument deduction/substitution failed: In file included from main.cpp:1: /usr/include/c++/9/variant:609:6: note: ‘me_data’ is not derived from ‘std::in_place_type_t<_Tp>’ 609 | = variant<_Types...>(__rhs_mem); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from main.cpp:1: /usr/include/c++/9/variant:1301:2: note: candidate: ‘template<class _Tp, class, class, class _Tj, class> constexpr std::variant<_Types>::variant(_Tp&&)’ 1301 | variant(_Tp&& __t) | ^~~~~~~ /usr/include/c++/9/variant:1301:2: note: template argument deduction/substitution failed: /usr/include/c++/9/variant:1289:7: note: candidate: ‘std::variant<_Types>::variant(std::variant<_Types>&&) [with _Types = {me_data, me_data}]’ 1289 | variant(variant&&) = default; | ^~~~~~~ /usr/include/c++/9/variant:1289:15: note: no known conversion for argument 1 from ‘const me_data’ to ‘std::variant<me_data, me_data>&&’ 1289 | variant(variant&&) = default; | ^~~~~~~~~ /usr/include/c++/9/variant:1288:7: note: candidate: ‘std::variant<_Types>::variant(const std::variant<_Types>&) [with _Types = {me_data, me_data}]’ 1288 | variant(const variant& __rhs) = default; | ^~~~~~~ /usr/include/c++/9/variant:1288:30: note: no known conversion for argument 1 from ‘const me_data’ to ‘const std::variant<me_data, me_data>&’ 1288 | variant(const variant& __rhs) = default; | ~~~~~~~~~~~~~~~^~~~~ /usr/include/c++/9/variant:1287:7: note: candidate: ‘constexpr std::variant<_Types>::variant() [with _Types = {me_data, me_data}]’ 1287 | variant() = default; | ^~~~~~~ /usr/include/c++/9/variant:1287:7: note: candidate expects 0 arguments, 1 provided --- When using variant with the same type two times, it fails to compile if the type have potentially-throwing copy constructor and noexcept move constructor. All other combinations of throwing policy work.