title: Why can't I create a temporary of this templated class with an lvalue constructor argument?
body: <p>For the life of me I can't seem to create a temporary of this class, why isn't it allowing me to?</p>
  <pre><code>template &lt;typename T&gt;
  struct Dog
  {
      Dog(T t) : tag(t) {}
      T tag; 
  };
  
  int main()
  {
      int tag = 6;
      Dog&lt;int&gt;(6); // Works fine
      Dog&lt;int&gt;(tag); // On Visual Studio I get no default constructor exists for class Dog&lt;int&gt;
                    // On onlineGDB I get error: no matching function for call to ‘Dog::Dog()’
  }
  </code></pre>
  <p>Also, what's the difference here, again between rvalue and lvalue:</p>
  <pre><code>Dog(6); // Deduces fine
  Dog(tag); // Deduction fail, error: missing template arguments before ‘(’ token
  </code></pre>
  <p>Also:</p>
  <pre><code>Dog&lt;int&gt;{tag}; // Works. 
  </code></pre>
  <p>I take it because this is aggregate initialization?</p>