理解 C 11「auto」語意
在 C 11 中,「auto」關鍵字允許自動型別推導。然而,確定它是否解析為值或引用有時可能會不明確。
型別推導規則:
「auto」中的型別推導規則很簡單:取決於物件的宣告方式。
例如:
<code class="cpp">int i = 5;</code>
如果我們聲明:
<code class="cpp">auto a1 = i; // value auto &a2 = i; // reference</code>
a1 將被扣除為值型別(int),而a2將被推導為引用型別( int&)。
不明確的情況:
考慮以下範例:
<code class="cpp">const std::shared_ptr<Foo>& get_foo(); auto p = get_foo(); // Copy or reference?</code>
get_foo 回傳一個引用,但 p 被宣告為「auto」。在這種情況下,auto 會將 p 的型別推論為 Foo 的引用。
<code class="cpp">static std::shared_ptr<Foo> s_foo; auto sp = s_foo; // Copy or reference?</code>
s_foo 是指向 Foo 的共用指標的靜態實例。 sp 是使用「auto」聲明的,因此它將被推導為 Foo 的共享指標。
<code class="cpp">std::vector<std::shared_ptr<Foo>> c; for (auto foo: c) { // Copy for every loop iteration?</code>
這裡,「auto」將迭代向量,將 foo 的型別推導為共享指標到福。這意味著每次迭代都會建立一個新的臨時共用指標。
演示:
以下代碼演示了這些概念:
<code class="cpp">#include <typeinfo> #include <iostream> template< typename T > struct A { static void foo(){ std::cout << "value" << std::endl; } }; template< typename T > struct A< T&& > { static void foo(){ std::cout << "reference" << std::endl; } }; float& bar() { static float t=5.5; return t; } int main() { int i = 5; int &r = i; auto a1 = i; auto a2 = r; auto a3 = bar(); A<decltype(i)>::foo(); // value A<decltype(r)>::foo(); // reference A<decltype(a1)>::foo(); // value A<decltype(a2)>::foo(); // value A<decltype(bar())>::foo(); // reference A<decltype(a3)>::foo(); // value }</code>
輸出:
value reference value value reference value
以上是C 11 中「auto」什麼時候推導出數值或引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!