title: understanding of non-type template parameters
body: <p>I have problem understanding the following paragraph Per C++11 Standard N3485 Section 14.1.7.
  I think it is more important to understand the rationale instead of memorizing the facts.</p>
  
  <blockquote>
    <blockquote>
      <p>A non-type template-parameter shall not be declared to have floating point, class, or void type.<br>
      [ Example:   </p>
    </blockquote>
  
  <pre><code>template&lt;double d&gt; class X; // error
  template&lt;double* pd&gt; class Y; // OK
  template&lt;double&amp; rd&gt; class Z; // OK
  </code></pre>
    
    <p>—end example ]</p>
  </blockquote>
  
  <p>I have some questions regarding this rule:</p>
  
  <ol>
  <li><p><strong>Is there a reason that why <code>floating point</code> type cannot be used as template parameter? What is the rationale behind that?</strong> I know this is true before C++11 and it seems also true for C++11 standard.</p></li>
  <li><p><strong>Why it is OK to use <code>pointer</code> or <code>reference</code> to floating point types as non-template parameters, but not raw floating point type?</strong> What is the big difference here?</p></li>
  </ol>
  
  <p>Thank you for your help.</p>