天天看点

引用初始化的重要细节

<code>#include&lt;iostream&gt;</code>

<code>using</code> <code>std::cout;</code>

<code>using</code> <code>std::endl;</code>

<code>template</code><code>&lt;</code><code>typename</code> <code>T&gt;</code>

<code>void</code> <code>swap(T&amp;a, T&amp;b){</code>

<code>    </code><code>a = a ^ b;</code>

<code>    </code><code>b = a ^ b;</code>

<code>}</code>

<code>int</code> <code>main(){</code>

<code>    </code><code>short</code> <code>s = 50;</code>

<code>    </code><code>//error: invalid initialization of reference of type ‘int&amp;’ from expression of type ‘short int’</code>

<code>    </code><code>//无效的初始化:用'short int'类型的表达式来初始化'int&amp;'类型的引用。</code>

<code>    </code><code>//原因:用左值来初始化引用时,类型必须一致,不允许隐式转换。</code>

<code>    </code><code>//int &amp;ri1 = s;</code>

<code>    </code> 

<code>    </code><code>//invalid initialization of non-const reference of type ‘int&amp;’ from an rvalue of type ‘int’</code>

<code>    </code><code>//无效的初始化:用'int'类型的右值来初始化'int &amp;'类型的non-const引用。</code>

<code>    </code><code>//原因:用右值来初始化引用时,会产生一个同类型的匿名临时变量,对表达式的值进行隐式转换,再对这个临时变量赋值。</code>

<code>    </code><code>//int &amp;ri2 = 50;</code>

<code>    </code><code>//如果允许对这个临时变量定义一个non-const类型的引用,那么后续代码对这个引用的写操作毫无意义。例如: </code>

<code>    </code><code>//int &amp;i = 3;</code>

<code>    </code><code>//int&amp; j = 4;</code>

<code>    </code><code>//swap&lt;int&gt;(i,j);</code>

<code>    </code><code>//将无法对i,j进行交换。</code>

<code>    </code><code>//有效的初始化:用'int'类型的右值来初始化'int &amp;'类型的const引用。</code>

<code>    </code><code>const</code> <code>int</code> <code>&amp;ri3 = 60;</code>

下面的代码显示,用右值初始化一个引用时,生成了一个匿名临时变量:

<code>class</code> <code>TestType{</code>

<code>    </code><code>int</code> <code>m_data;</code>

<code>public</code><code>:</code>

<code>    </code><code>TestType() : m_data(0) {</code>

<code>        </code><code>cout &lt;&lt; __FUNCTION__ &lt;&lt; </code><code>"(), this = "</code> <code>&lt;&lt; </code><code>this</code><code>;</code>

<code>        </code><code>cout &lt;&lt; </code><code>", m_data = ("</code> <code>&lt;&lt; &amp;m_data &lt;&lt; </code><code>", "</code> <code>&lt;&lt; m_data &lt;&lt; </code><code>")\n"</code><code>;</code>

<code>    </code><code>}</code>

<code>    </code><code>//TestType(int val) : m_data(val) {</code>

<code>    </code><code>//    cout &lt;&lt; __FUNCTION__ &lt;&lt; "(int val), this = " &lt;&lt; this;</code>

<code>    </code><code>//    cout &lt;&lt; ", m_data = (" &lt;&lt; &amp;m_data &lt;&lt; ", " &lt;&lt; m_data &lt;&lt; ")";</code>

<code>    </code><code>//    cout &lt;&lt; ", val = (" &lt;&lt; &amp;val &lt;&lt; ", " &lt;&lt; val &lt;&lt; ").\n";</code>

<code>    </code><code>//}</code>

<code>    </code><code>TestType(</code><code>const</code> <code>int</code> <code>&amp;rv) : m_data(rv) {</code>

<code>        </code><code>cout &lt;&lt; __FUNCTION__ &lt;&lt; </code><code>"(int &amp;rv), this = "</code> <code>&lt;&lt; </code><code>this</code><code>;</code>

<code>        </code><code>cout &lt;&lt; </code><code>", m_data = ("</code> <code>&lt;&lt; &amp;m_data &lt;&lt; </code><code>", "</code> <code>&lt;&lt; m_data &lt;&lt; </code><code>")"</code><code>;</code>

<code>        </code><code>cout &lt;&lt; </code><code>", rv = ("</code> <code>&lt;&lt; &amp;rv &lt;&lt; </code><code>", "</code> <code>&lt;&lt; rv &lt;&lt; </code><code>").\n"</code><code>;</code>

<code>};</code>

<code>    </code><code>cout &lt;&lt; </code><code>"sizeof(TestType) = "</code> <code>&lt;&lt; </code><code>sizeof</code><code>(TestType) &lt;&lt; endl;</code>

<code>    </code><code>TestType dat1;</code>

<code>    </code><code>TestType dat2(100);</code>

<code>    </code><code>int</code> <code>i = 200;</code>

<code>    </code><code>cout &lt;&lt; </code><code>"i = ("</code> <code>&lt;&lt; &amp;i &lt;&lt; </code><code>", "</code> <code>&lt;&lt; i &lt;&lt; </code><code>")\n"</code><code>;</code>

<code>    </code><code>TestType dat3(i);</code>

<code>    </code><code>return</code> <code>0;</code>

运行结果:

sizeof(TestType) = 4

TestType(), this = 0x7fffc5b81cd0, m_data = (0x7fffc5b81cd0, 0)

TestType(int &amp;rv), this = 0x7fffc5b81ce0, m_data = (0x7fffc5b81ce0, 100), rv = (0x7fffc5b81cfc, 100).

i = (0x7fffc5b81cfc, 200)

TestType(int &amp;rv), this = 0x7fffc5b81cf0, m_data = (0x7fffc5b81cf0, 200), rv = (0x7fffc5b81cfc, 200).

      本文转自FrankNie0101 51CTO博客,原文链接:http://blog.51cto.com/frankniefaquan/1934509,如需转载请自行联系原作者

继续阅读