title: How to define a contructor for <...auto...>
body: <p>With the following program, which is an extract from something larger that I'm experimenting with, I get an error message that seems to be related to the constructor for <code>fixed_string</code></p>
  <pre><code>#include &lt;string&gt;
  #include &lt;cstring&gt;
  
  template&lt;std::size_t N&gt;
  struct fixed_string {
      static const constexpr std::size_t size__ = N;
  
      constexpr fixed_string(char const* s) :
              buf(&quot;&quot;) {
          for (std::size_t i = 0; i &lt;= N; ++i)
              buf[i] = s[i];
      }
      constexpr operator char const*() const {
          return buf;
      }
      constexpr bool operator==(const char* other) const {
          return ::strncmp(buf, other, N) == 0;
      }
      template&lt;std::size_t M&gt;
      constexpr bool compare(const fixed_string&lt;M&gt;&amp; other) const {
          return (N == M &amp;&amp; ::strncmp(buf, other.buf, N) == 0) ? std::true_type(): std::false_type();
      }
  
      char buf[N + 1];
  };
  
  template&lt;std::size_t N&gt;
  fixed_string(char const (&amp;)[N]) -&gt; fixed_string&lt;N - 1&gt;;
  
  ////////////////////////////////////////////
  
  template&lt;fixed_string TARGET_NAME, fixed_string THIS_NAME&gt;
  concept NameMatches = (TARGET_NAME.compare(THIS_NAME));
  
  template&lt;fixed_string NAME, typename TYPE&gt;
  class Member {
  public:
      static const constexpr fixed_string name__ { NAME };
  
  public:
      template&lt;fixed_string TARGET_NAME&gt;
      const TYPE&amp; get() const requires NameMatches&lt;TARGET_NAME, TYPE::name__&gt; const {
          return member_;
      }
  
  protected:
      TYPE member_;
  };
  
  template&lt;typename ... MEMBERS&gt;
  class Container: public MEMBERS... {
  };
  </code></pre>
  <p>The error messages are:</p>
  <pre><code>../src/test-concepts.cpp:43:35: error: class template argument deduction failed:
     43 |  const TYPE&amp; get() const requires NameMatches&lt;TARGET_NAME, TYPE::name__&gt; const {
        |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../src/test-concepts.cpp:43:35: error: no matching function for call to ‘fixed_string(fixed_string&lt;...auto...&gt;)’
  ../src/test-concepts.cpp:8:12: note: candidate: ‘template&lt;long unsigned int N&gt; fixed_string(const char*)-&gt; fixed_string&lt;N&gt;’
      8 |  constexpr fixed_string(char const* s) :
        |            ^~~~~~~~~~~~
  ../src/test-concepts.cpp:8:12: note:   template argument deduction/substitution failed:
  ../src/test-concepts.cpp:43:35: note:   couldn’t deduce template parameter ‘N’
     43 |  const TYPE&amp; get() const requires NameMatches&lt;TARGET_NAME, TYPE::name__&gt; const {
        |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../src/test-concepts.cpp:5:8: note: candidate: ‘template&lt;long unsigned int N&gt; fixed_string(fixed_string&lt;N&gt;)-&gt; fixed_string&lt;N&gt;’
      5 | struct fixed_string {
        |        ^~~~~~~~~~~~
  ../src/test-concepts.cpp:5:8: note:   template argument deduction/substitution failed:
  ../src/test-concepts.cpp:43:35: note:   mismatched types ‘fixed_string&lt;N&gt;’ and ‘fixed_string&lt;...auto...&gt;’
     43 |  const TYPE&amp; get() const requires NameMatches&lt;TARGET_NAME, TYPE::name__&gt; const {
        |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../src/test-concepts.cpp:28:1: note: candidate: ‘template&lt;long unsigned int N&gt; fixed_string(const char (&amp;)[N])-&gt; fixed_string&lt;(N - 1)&gt;’
     28 | fixed_string(char const (&amp;)[N]) -&gt; fixed_string&lt;N - 1&gt;;
        | ^~~~~~~~~~~~
  ../src/test-concepts.cpp:28:1: note:   template argument deduction/substitution failed:
  ../src/test-concepts.cpp:43:35: note:   mismatched types ‘const char [N]’ and ‘fixed_string&lt;...auto...&gt;’
     43 |  const TYPE&amp; get() const requires NameMatches&lt;TARGET_NAME, TYPE::name__&gt; const {
        |                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ../src/test-concepts.cpp:43: confused by earlier errors, bailing out
  </code></pre>
  <p>This is part of a project using templates that overloads a given function (<code>get</code> in this case), for which there is only one suitable candidate that fulfils the constraint. The value that the constraint operates on is a name - a string literal - not a const string variable, which is passed as a non-type parameter to an instantiation of the template: something like:</p>
  <pre><code>Container&lt;Member&lt;&quot;fred&quot;, std::string&gt;, Member&lt;&quot;bert&quot;, int&gt;, Member&lt;&quot;alfie&quot;, bool&gt;&gt; some_values;
  </code></pre>
  <p>I want to be able to retrieve a value using something like</p>
  <pre><code>int result = some_values.get&lt;&quot;bert&quot;&gt;();
  </code></pre>
  <p>I have had difficulty finding much information about the &quot;<code>&lt;...auto...&gt;</code>&quot; specialisation of the template. I presume this is an internal representation used by <code>gcc</code> for constant, non-type values.</p>
  <p>The error messages point me to the lack of a suitable overloaded constructor for <code>fixed_string</code>. What should this be?</p>