Inheriting constructors of isl::optional<T> results in a compilation error on gcc 6.4 and lower
improbablejan opened this issue · 3 comments
The following code fails to compile on gcc versions 6.4 and lower:
struct foo : nonstd::optional<int> {
using nonstd::optional<int>::optional;
};
while it appears to work with gcc version 7.1 and above. The compilation error produced (with --std=c++14
GCC 6.4 on godbolt.org):
<source>:1704:34: error: 'template<class U> constexpr foo::foo(U&&)' inherited from 'nonstd::optional_lite::optional<int>'
using nonstd::optional<int>::optional;
^~~~~~~~
<source>:1704:34: error: conflicts with version inherited from 'nonstd::optional_lite::optional<int>'
<source>:1704:34: error: 'template<class U> foo::foo(nonstd::optional_lite::optional<T>&&)' inherited from 'nonstd::optional_lite::optional<int>'
<source>:1704:34: error: conflicts with version inherited from 'nonstd::optional_lite::optional<int>'
<source>:1704:34: error: 'template<class U> foo::foo(const nonstd::optional_lite::optional<T>&)' inherited from 'nonstd::optional_lite::optional<int>'
<source>:1704:34: error: conflicts with version inherited from 'nonstd::optional_lite::optional<int>'
Compiler returned: 1
@improbable-nickkrempel believes it could be due to the change in inheriting constructor semantics
which resolves issue 1941. Switching the SFINAE method used from a default argument to a default template type does seem to resolve the issue. Is there any reason why optional_REQUIRES_A
is used when using SFINAE with constructors instead of optional_REQUIRES_T
, or could the method be switched in order to better support older GCC versions?
@improbablejan, started working on it...
@improbablejan, it looks like nonstd::optional<>
can now be inherited from.
Thanks for your helpful suggestion.
Thanks for the quick turnaround!