boostorg / boostorg/variant

Variant fails with private default constructor

Open
#103 0 comments 1 reaction 0 assignees View on GitHub
Dominant language
C++
Stars
47
Forks
71
PR merge metrics
No merged PRs in 30d

Description

Boost.Variant fails if its types have a private default constructor, using gcc 12.2
Minimal example: https://godbolt.org/z/cG4PnW8ee

```
#include
#include
class Foo
{
public:
Foo(int a_) : a(a_) {}
int a;
private:
Foo();
};
struct Voo
{
Foo f;
double d;
};
struct Doo
{
Foo f;
int s;
};
#ifndef USE_VARIANT2
using VooDoo = boost::variant;
void testVooDoo(const VooDoo& voodoo)
{
VooDoo v{Voo{Foo(3)}};
}
#else
using VooDoo = boost::variant2::variant;
void testVooDoo(const VooDoo& voodoo)
{
VooDoo v{Voo{Foo(3)}};
}
#endif
```
If I change to use Boost.Variant2, it works.
If I go back to gcc 7.5, it works (fails after that version).

The error shows:
```
/opt/compiler-explorer/libs/boost_1_80_0/boost/variant/variant.hpp:194:17: required from 'struct boost::detail::variant::find_fallback_type, Voo, boost::mpl::l_item, Doo, boost::mpl::l_end> > >'
/opt/compiler-explorer/libs/boost_1_80_0/boost/variant/variant.hpp:1252:17: required from 'class boost::variant'
:26:16: required from here
/opt/compiler-explorer/libs/boost_1_80_0/boost/type_traits/has_nothrow_constructor.hpp:27:84: error: 'Foo::Foo()' is private within this context
27 | template struct has_nothrow_constructor : public integral_constant{};
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:9:9: note: declared private here
9 | Foo();
| ^~~
```
It mentions `find_fallback_type`, so I guess that at some point it tries to determine the "fallback type" to default construct the `VooDoo`.
However, nowhere in my program I need to default construct a `VooDoo`, so I'm not sure why that type needs to be "computed".

Also, somehow Boost.Variant2 doesn't fail, so there must be a way to make this work.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.