https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77595

            Bug ID: 77595
           Summary: concepts: constrained member functions illegally
                    instantiated during explicit class template
                    instantiation
           Product: gcc
           Version: 6.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: akrzemi1 at gmail dot com
  Target Milestone: ---

The following correct program, compiled with -fconcepts, gives compilation
errors:

```
#include <memory>
#include <type_traits>

template <typename T>
struct Wrapper
{
    T val;

    explicit Wrapper(T && v)
      : val(std::move(v)) {}

    explicit Wrapper(T const & v)
      requires std::is_copy_constructible<T>::value
      : val(v) {}
};

template struct Wrapper<std::unique_ptr<int>>;

int main() {}
```

According to p0121r0, 14.8.2 [temp.explicit]:

"An explicit instantiation that names a class template specialization is also
an explicit instantiation of the same kind (declaration or definition) of each
of its members (not including members inherited from base classes and members
that are templates) that has not been previously explicitly specialized in the
translation unit containing the explicit instantiation, and provided that
the associated constraints, if any, of that member are satisfied by the
template arguments of the explicit instantiation (14.10.2), except as described
below."

Reply via email to