{"id":326,"date":"2018-03-16T19:48:25","date_gmt":"2018-03-16T19:48:25","guid":{"rendered":"http:\/\/www.yazilimperver.com\/?p=326"},"modified":"2019-12-29T15:14:36","modified_gmt":"2019-12-29T15:14:36","slug":"modern-c-5-tasima-semantikleri","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/","title":{"rendered":"Modern C++ (5) : Ta\u015f\u0131ma Semantikleri"},"content":{"rendered":"<p>Evet bir di\u011fer Modern C++ 11 ile yaz\u0131m\u0131z ile tekrar birlikteyiz. Bu yaz\u0131m\u0131zda C++ 11 ile gelen \u00f6nemli de\u011fi\u015fikliklerden biri olan &#8220;Move Semantics&#8221; yani Ta\u015f\u0131ma Semantiklerinden sizlere bahsedece\u011fim. Bu konu da derya deniz bir konu. Bu yaz\u0131mda sadece \u00f6nemli hususlar\u0131n \u00fczerinden ge\u00e7ip, genel mant\u0131\u011f\u0131 sizlere aktar\u0131p, kalan\u0131n\u0131 na\u00e7izane sizlere b\u0131rakaca\u011f\u0131m \ud83d\ude42 Daha lambda&#8217;lar var garda\u015f\u0131m ne yapam yani.<\/p>\n<p>Ta\u015f\u0131ma semantiklerinden bahsetmeden \u00f6nce beyin kaslar\u0131m\u0131z\u0131 \u0131s\u0131nd\u0131rma ve merakland\u0131rma ad\u0131na, bu konu ile ilgili bir tak\u0131m kavramlar\u0131 a\u015fa\u011f\u0131da s\u0131ralamaya \u00e7al\u0131\u015ft\u0131m, yaz\u0131mda bunlara teker teker de\u011finece\u011fiz. Nedir bunlar:<\/p>\n<ul>\n<li>rvalue referanslar\u0131<\/li>\n<li>m\u00fckemmel y\u00f6nlendirme &#8220;perfect forwarding&#8221; ve std::forward<\/li>\n<li>std::move<\/li>\n<li>ta\u015f\u0131ma olu\u015fturucular\u0131 (&#8220;move constructor&#8221;) ve ta\u015f\u0131ma atama operat\u00f6rleri (&#8220;move assignment operator&#8221;)<\/li>\n<\/ul>\n<h2><strong><span style=\"color: #0000ff;\">Giri\u015f<\/span><\/strong><\/h2>\n<p>Ta\u015f\u0131ma semanti\u011finin arkas\u0131nda yatan en \u00f6nemli motivasyon arkada\u015flar performans. \u015e\u00f6yleki C++ da metotlara parametre ge\u00e7irme y\u00f6ntemlerine bakt\u0131\u011f\u0131m\u0131z zaman elimizde bir ka\u00e7 se\u00e7ene\u011fimiz var nedir bunlar:<\/p>\n<ul>\n<li><strong>&#8220;Pass by value&#8221;<\/strong>: Bu durumda ise ilgili de\u011ferin kendisi metoda kopyalanarak ge\u00e7irilir ve metot i\u00e7erisinde bu parametreye yap\u0131lan de\u011fi\u015fiklikler ilgili de\u011fere yans\u0131t\u0131lmaz. Fazladan bir kopyalama yap\u0131ld\u0131\u011f\u0131 i\u00e7in b\u00fcy\u00fck veri yap\u0131lar\u0131nda performans kayb\u0131na yol a\u00e7ar.<\/li>\n<li><strong>&#8220;Pass by reference&#8221;<\/strong> : Yani parametrelerin referans (&amp;) operat\u00f6r\u00fc kullan\u0131larak metotlara ge\u00e7irilmesi. Bu durumda ilgili parametrelerin sadece adresinin (kendisi de\u011fil) kopyas\u0131 tutulur. Bu bir nebze i\u015faret\u00e7i kullan\u0131larak parametrelerin ge\u00e7irilmesine benzer ve metot i\u00e7erisinde yap\u0131lan de\u011fi\u015fiklikler ilgili parametreleri de\u011fi\u015ftirir. Parametrenin kendisi kopyalanmaz.<\/li>\n<\/ul>\n<p>Peki burada &#8220;Pass by value&#8221; durumundaki kopyalama yapmadan bir \u015fekilde ilgili de\u011feri <em><strong>ta\u015f\u0131yamaz<\/strong> <\/em>m\u0131y\u0131z? Bu sayede gereksiz kopyalama masraf\u0131ndan da kurtulabiliriz. Burada kopyalama ile ta\u015f\u0131ma i\u015flemi aras\u0131nda en \u00f6nemli fark, kopyalama durumunda kaynak hi\u00e7 bir \u015fekilde de\u011fi\u015ftirilmez bu operasyondan etkilenmez. Ta\u015f\u0131ma durumunda ise kayna\u011fa g\u00f6re bu durum de\u011fi\u015febilir.<\/p>\n<p>Ta\u015f\u0131ma semanti\u011finin temelinde yatan \u015fey ilgili kayna\u011f\u0131n sahipli\u011finin bir nesneden ba\u015fka bir nesneye kopyalama yap\u0131lmadan &#8216;<em>ta\u015f\u0131nmas\u0131<\/em>&#8216; \/ aktar\u0131lmas\u0131 olarak \u00f6zetlenebilir.<\/p>\n<p>\u015eimdi buraya kadar g\u00f6rd\u00fcklerimizi bir ka\u00e7 \u00f6rnek ile peki\u015ftirmeye \u00e7al\u0131\u015fal\u0131m. \u00d6rne\u011fin bir metodumuz olsun ve bu metodun b\u00fcy\u00fck bir nesne d\u00f6nd\u00fc\u011f\u00fcn\u00fc d\u00fc\u015f\u00fcnelim. Normal \u015fartlarda bunu iki \u015fekilde yapabiliriz. Birincisi i\u015faret\u00e7iler kullanarak bunu d\u00f6nebiliriz:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true  \">vector&lt;int&gt;* MakeBigVector()\r\n{\r\n   vector&lt;int&gt;* result = new vector&lt;int&gt;(1024);\r\n   for(int i=0; i&lt;1024; i++) \r\n   { \r\n      result[i] = rand(); \r\n   }\r\n   return result;\r\n}\r\n:::\r\nvector&lt;int&gt;* v = MakeBigVector();<\/pre>\n<p>Ya da ilgili nesneyi &#8220;pass-by-reference&#8221; y\u00f6ntemi ile ge\u00e7irebiliriz.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">void MakeBigVector(vector&lt;int&gt;&amp; out)\r\n{\r\n   out.resize(1024);\r\n   for(int i=0; i&lt;1024; i++) \r\n   { \r\n      out[i] = rand(); \r\n   }\r\n}\r\n:::\r\nvector&lt;int&gt; v;\r\nMakeBigVector(v);<\/pre>\n<p>\u0130\u015fte ta\u015f\u0131ma semanti\u011fi ile art\u0131k bunu a\u015fa\u011f\u0131daki gibi de yapabiliyoruz (Tabi burada std::vector varsay\u0131lan olarak bu ta\u015f\u0131ma semanti\u011fini destekledi\u011finden bunu yapabiliyoruz \ud83d\ude42<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">vector&lt;int&gt; MakeBigVector()\r\n{\r\n   vector&lt;int&gt; result;\r\n   \r\n   for(int i=0; i&lt;1024; i++) \r\n   { \r\n      result[i] = rand(); \r\n   }\r\n   return result;\r\n}\r\n:::\r\n\/\/ C++ 11 de bu i\u015f i\u00e7in kopyalama yap\u0131lmaz ama \u00f6ncekilerde b\u00fct\u00fcn de\u011ferler kopyalan\u0131rd\u0131\r\nvector&lt;int&gt; v = MakeBigVector();<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi C++03 kullan\u0131m\u0131ndan hi\u00e7 bir fark\u0131 yok. Bunun en \u00f6nemli art\u0131s\u0131 bu ve benzeri dil ve STL taraf\u0131ndan ta\u015f\u0131ma mant\u0131\u011f\u0131 eklenmi\u015f olan veri yap\u0131lar\u0131 kullanan kodlar\u0131n\u0131z otomatikmen ta\u015f\u0131ma mant\u0131\u011f\u0131n\u0131 kullan\u0131r hale gelmi\u015f olacak.<\/p>\n<p>Benzer \u015fekilde bir metottan ilgili nesnelerin d\u00f6n\u00fclmesinde veya parametre olarak ge\u00e7irilmesi durumunda ta\u015f\u0131ma mant\u0131\u011f\u0131n\u0131 kullanmak i\u00e7in a\u015fa\u011f\u0131daki ko\u015fullar\u0131n sa\u011flanmas\u0131 gerekmekte:<\/p>\n<ul>\n<li>nesne rvalue olmal\u0131,<\/li>\n<li>ilgili nesneye ili\u015fkin s\u0131n\u0131fta \u00f6zel \u00fcyem ta\u015f\u0131ma metotlar\u0131n\u0131n tan\u0131mlanm\u0131\u015f olmal\u0131 (ileride ta\u015f\u0131ma olu\u015fturucu ve kopya olu\u015fturucu ba\u015fl\u0131klar\u0131na bakabilirsiniz).<\/li>\n<\/ul>\n<p>Bundan sonra anlatacaklar\u0131m\u0131n hepsi bu temel ilke \u00fczerine kurulu.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">rvalue Referanslar\u0131<\/span><\/strong><\/h2>\n<p>rvalue referanslar\u0131na ge\u00e7meden \u00f6nce lvalue&#8217;ler rvalue&#8217;lere bir bakmam\u0131z iyi olacak.<\/p>\n<ul>\n<li><strong>lvalue<\/strong>: Bellekte bir yer tutan ve adresi temin edilen de\u011fer\/ifade (&#8220;expression&#8221;).<\/li>\n<li><strong>rvalue<\/strong>: Herhangi bir tan\u0131mlamas\u0131 olmayan ve sadece hesaplama s\u0131ras\u0131nda var olan ve kullan\u0131lan de\u011fer\/ifade. Genelde C++ ve C kaynaklar\u0131nda lvalue olmayan b\u00fct\u00fcn ifadeler<\/li>\n<li>Daha \u00f6nceleri &amp; operat\u00f6r\u00fc sadece lvalue&#8217;ler i\u00e7in kullan\u0131labilmekteydi.\u00a0 Ta\u015f\u0131ma semanti\u011fi ile art\u0131k &amp;&amp; operat\u00f6r\u00fc de rvalue&#8217;ler i\u00e7in kullan\u0131lmakta.<\/li>\n<\/ul>\n<p>\u015eimdi bir ka\u00e7 \u00f6rnek ile bunlar\u0131n kullan\u0131m\u0131na bakal\u0131m:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">\/\/ Burada a bir lvalue ve 1 ise rvalue'd\u00fcr\r\nint a = 1;\r\n\r\n...\r\n\r\n\/\/ Bu metot yerel bir de\u011fi\u015fken d\u00f6nd\u00fc\u011f\u00fc i\u00e7in, d\u00f6nd\u00fc\u011f\u00fc de\u011fer rvalue'd\u00fcr\r\nstring getName() \r\n{ \r\n   string s = \"Hello world\"; \r\n   return s; \r\n}\r\n\r\nint main()\r\n{\r\n      \/\/ rvalue'yu referans operat\u00f6r\u00fc ile kullanamazs\u0131n\u0131z\r\n      \/\/ error: cannot bind non-const lvalue reference of type 'std: bla bla hatas\u0131 al\u0131n\u0131r\r\n      string&amp; deneme = getName();\r\n\r\n      \/\/ Problem yok. rvalue referans operat\u00f6r\u00fc bunun i\u00e7in dostum\r\n      \/\/ Kopyalama yok\r\n      string&amp;&amp; deneme2 = getName(); \r\n\r\n      \/\/ C++ 03 de kopyalama yap\u0131l\u0131yor\r\n      \/\/ C++ 11 de yap\u0131lmaz\r\n      string deneme = getName(); \r\n}\r\n\r\n<\/pre>\n<h2><span style=\"color: #0000ff;\">M\u00fckemmel Y\u00f6nlendirme &#8220;Perfect Forwarding&#8221;<\/span><\/h2>\n<p>M\u00fckemmel y\u00f6nlendirme \u00f6zellikle fonksiyon \u015fablonlar\u0131 i\u00e7in rvalue referansl\u0131 parametrelere ge\u00e7irilmesi durumu i\u00e7in kullan\u0131\u015fl\u0131 bir mekanizma. E\u011fer ge\u00e7irilen parametre tipi rvalue referans\u0131 ise ve de ge\u00e7irilen parametre lvalue ise bu parametreye lvalue referans gibi davran\u0131l\u0131yor (yani ilgili parametreye yap\u0131lan de\u011fi\u015fiklikle de\u011ferini de\u011fi\u015ftiriyor. Bknz. &#8220;pass-by-reference&#8221;), ba\u015fka tip bir veri ge\u00e7irilir ise temel bir tip olarak davran\u0131l\u0131yor. \u015eimdi bu durumlar\u0131 a\u015fa\u011f\u0131daki \u00f6rnekler ile inceleyelim:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">template&lt;typename T&gt;\r\nvoid Foo(T&amp;&amp; t);\r\n\r\nint main()\r\n{\r\n    X x;\r\n    \/\/ 1) Bu durumda ge\u00e7irilen parametre lvalue oldu\u011fu i\u00e7in T burada X&amp; olarak kabul edilir\r\n    FOO(x);\r\n    \r\n    \/\/ 2) Bu durumda ge\u00e7irilen parametre ge\u00e7ici bir nesne oldu\u011fu i\u00e7in rvaluedur ve bu durumda da \r\n    \/\/ T X olarak kabul edilir.\r\n    FOO(X()); \/\/ 2\r\n}<\/pre>\n<p>Bu sayede lvalue ve rvalue referanslar\u0131 i\u00e7in ayr\u0131 ayr\u0131 metotlar yazman\u0131za gerek kalmaz. Bunun ile birlikte herhangi metoda ge\u00e7irilen lvalue\/rvalue parametreleri bu yap\u0131lar\u0131 korunarak ba\u015fka metotlara ge\u00e7irilebilir. Bunun i\u00e7in de std::forward metodu kullan\u0131l\u0131r. \u0130\u015fte bu olaya <strong>M\u00fckemmel Y\u00f6nlendirme\u00a0<\/strong>denir. Bu sayede gereksiz kopyalamalar\u0131n \u00f6n\u00fcne ge\u00e7ilir ve gereksiz lvalue\/rvalue metotlar\u0131n\u0131n fazladan yaz\u0131lmas\u0131na ihtiya\u00e7 kalmaz. Yukar\u0131daki \u00f6rne\u011fin devam\u0131 niteli\u011finde olan a\u015fa\u011f\u0131daki kullan\u0131ma bakal\u0131m:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">\/\/ A) rvalue referans\u0131 alan metot\r\nvoid Goo(X&amp;&amp; t);\r\n\r\n\/\/ B) lvalue referans\u0131 alan metot\r\nvoid Goo(X&amp; t);\r\n\r\ntemplate&lt;typename T&gt;\r\nvoid Foo(T&amp;&amp; t)\r\n{\r\n    \/\/ Gelen T tipine g\u00f6re ilgili Goo metodu otomatik olarak belirlenir\r\n    Goo(std::forward&lt;T&gt;(t));\r\n}\r\n\r\n\/\/ Benzer \u015fekilde rvalue referans\u0131 kullanan ba\u015fka bir metot\r\nvoid Hoo(X&amp;&amp; t)\r\n{\r\n    Goo(t);\r\n}\r\n\r\nint main()\r\n{\r\n    X x;\r\n    Foo(x);   \/\/ 1\r\n    Foo(X()); \/\/ 2\r\n    Hoo(x);\r\n    Hoo(X()); \/\/ 3\r\n}<\/pre>\n<p>Yukar\u0131da Foo metodu i\u00e7erisinde hangi Goo&#8217;nun \u00e7a\u011fr\u0131laca\u011f\u0131 otomatik olarak belirlenir.<\/p>\n<p>1 ile i\u015faretlenen sat\u0131rda ge\u00e7ilen tip lvalue oldu\u011fu ve std::forward kullan\u0131m\u0131 sonucu B ile yorumlanan Goo metot (lvalue referans kullanan) \u00e7a\u011fr\u0131s\u0131 ger\u00e7ekle\u015ftirilir.<\/p>\n<p>2 ile i\u015faretlenen sat\u0131rda ge\u00e7ilen tip rvalue oldu\u011fu ve std::forward kullan\u0131m\u0131 sonucu A ile yorumlanan Goo metot (rvalue referans kullanan) \u00e7a\u011fr\u0131s\u0131 ger\u00e7ekle\u015ftirilir.<\/p>\n<p>Burada unutulmamas\u0131 gereken husus bu kullan\u0131m metot \u015fablonlar\u0131 i\u00e7in ge\u00e7erlidir.<\/p>\n<h2><span style=\"color: #0000ff;\">Ta\u015f\u0131ma Olu\u015fturucusu (&#8220;move constructor&#8221;) ve Ta\u015f\u0131ma Atama Operat\u00f6r\u00fc (&#8220;move assignment operator&#8221;)<\/span><\/h2>\n<p>Evet yaz\u0131m\u0131n ba\u015f\u0131nda da bahsetti\u011fim \u00fczere s\u0131n\u0131flar\u0131n\u0131za ta\u015f\u0131ma kabiliyeti kazand\u0131rmak i\u00e7in:<\/p>\n<ul>\n<li>Ta\u015f\u0131ma Olu\u015fturucusu (&#8220;Move constructor&#8221;)\n<ul>\n<li>Genel format =&gt;\u00a0<code>C::C(C&amp;&amp; other);<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Ta\u015f\u0131ma Atama Operat\u00f6r\u00fc (&#8220;Move Assignment Operator&#8221;)\n<ul>\n<li>Genel format =&gt;\u00a0<code>C&amp; C::operator=(C&amp;&amp; other);<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>tan\u0131mlaman\u0131z gerekmekte. Tabi \u00e7o\u011fu derleyici basit s\u0131n\u0131flar\u0131m\u0131z i\u00e7in yine bu metotlar\u0131 sa\u011f olsun bizler i\u00e7in tan\u0131mlar \ud83d\ude42 Ama velev ki karma\u015f\u0131k bir s\u0131n\u0131f\u0131m\u0131z var ya da kopya olu\u015fturucu veya atama metodu tan\u0131mlad\u0131k veya biz heyecan ar\u0131yoruz. Benzer \u015fekilde default ya da delete anahtar kelimelerini bu \u00f6zel metotlar i\u00e7in de kullanabilirsiniz.<\/p>\n<p>O durumda da\u00a0 a\u015fa\u011f\u0131daki \u00f6rne\u011fi kendinize referans alabilirsiniz efenim.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true \">#include &lt;iostream&gt;\r\n#include &lt;algorithm&gt;\r\n\r\nclass A\r\n{\r\npublic:\r\n    \/\/ Basit olu\u015fturucu ile kaynaklar\u0131n ilklendirilmesi\r\n    explicit A(size_t length)\r\n        : mLength(length), \r\n          mData(new int[length])\r\n    {\r\n        std::cout &lt;&lt; \"A(size_t). length = \"\r\n\t\t&lt;&lt; mLength &lt;&lt; \".\" &lt;&lt; std::endl;\r\n    }\r\n\r\n    \/\/ Yokedici :)\r\n    ~A()\r\n    {\r\n\tstd::cout &lt;&lt; \"~A(). length = \" &lt;&lt; mLength &lt;&lt; \".\";\r\n\r\n\tif (mData != NULL)\r\n        {\r\n            std::cout &lt;&lt; \" Deleting resource.\";\r\n\t    delete[] mData;  \/\/ Delete the resource.\r\n\t}\r\n\r\n\tstd::cout &lt;&lt; std::endl;\r\n    }\r\n\r\n    \/\/ Kopya olu\u015fturucu\r\n    A(const A&amp; other)\r\n\t    : mLength(other.mLength)\r\n            , mData(new int[other.mLength])\r\n    {\r\n\tstd::cout &lt;&lt; \"A(const A&amp;). length = \"\r\n\t\t&lt;&lt; other.mLength &lt;&lt; \". Copying resource.\" &lt;&lt; std::endl;\r\n\r\n\tstd::copy(other.mData, other.mData + mLength, mData);\r\n    }\r\n\r\n    \/\/ Kopya atama operat\u00f6r\u00fc\r\n    A&amp; operator=(const A&amp; other)\r\n    {\r\n\tstd::cout &lt;&lt; \"operator=(const A&amp;). length = \"\r\n\t         &lt;&lt; other.mLength &lt;&lt; \". Copying resource.\" &lt;&lt; std::endl;\r\n\r\n\tif (this != &amp;other;) \r\n        {\r\n\t    delete[] mData;  \/\/ Free the existing resource.\r\n\t    mLength = other.mLength;\r\n            mData = new int[mLength];\r\n            std::copy(other.mData, other.mData + mLength, mData);\r\n\t}\r\n\treturn *this;\r\n    }\r\n\r\n    \/\/ Ta\u015f\u0131ma olu\u015fturucusu\r\n    A(A&amp;&amp; other)\r\n     : mData(NULL)\r\n     , mLength(0)\r\n    {\r\n        std::cout &lt;&lt; \"A(A&amp;&amp;). length = \" \r\n             &lt;&lt; other.mLength &lt;&lt; \". Moving resource.\\n\";\r\n\r\n        \/\/ Gelen veri i\u015faret\u00e7isinden ilgili adresi ve boyutu al\r\n        mData = other.mData;\r\n        mLength = other.mLength;\r\n\r\n        \/\/ Kaynak i\u015faret\u00e7i taraf\u0131ndan adreslenen kayna\u011f\u0131 sal\u0131ver.\r\n        \/\/ Bunu yapmaz isek bellek birden fazla say\u0131da bo\u015falt\u0131lmaya \u00e7al\u0131\u015f\u0131l\u0131r\r\n        other.mData = NULL;\r\n        other.mLength = 0;\r\n    }\r\n\r\n    \/\/ Ta\u015f\u0131ma atanma operat\u00f6r\u00fc\r\n    A&amp; operator=(A&amp;&amp; other)\r\n    {\r\n        std::cout &lt;&lt; \"operator=(A&amp;&amp;). length = \" \r\n             &lt;&lt; other.mLength &lt;&lt; \".\" &lt;&lt; std::endl;\r\n\r\n        if (this != &amp;other)\r\n        {\r\n          \/\/ Mevcut verileri bo\u015falt\r\n          delete[] mData;\r\n\r\n          \/\/ Gelen veri i\u015faret\u00e7isinden ilgili adresi ve boyutu al\r\n          mData = other.mData;\r\n          mLength = other.mLength;\r\n\r\n          \/\/ Kaynak i\u015faret\u00e7i taraf\u0131ndan adreslenen kayna\u011f\u0131 sal\u0131ver.\r\n          \/\/ Bunu yapmaz isek bellek birden fazla say\u0131da bo\u015falt\u0131lmaya \u00e7al\u0131\u015f\u0131l\u0131r\r\n          other.mData = NULL;\r\n          other.mLength = 0;\r\n       }\r\n       return *this;\r\n    }\r\n\r\n    \/\/ Verinin boyutu d\u00f6n\u00fcl\u00fcr\r\n    size_t Length() const\r\n    {\r\n        return mLength;\r\n    }\r\n\r\nprivate:\r\n    \/\/ Verinin boyutu\r\n    size_t mLength; \r\n\r\n    \/\/ Veri\r\n    int* mData;     \r\n};<\/pre>\n<h2><strong><span style=\"color: #0000ff;\">std::move Metodu<\/span><\/strong><\/h2>\n<p>std::move metodunun asl\u0131nda yapt\u0131\u011f\u0131 \u00e7ok u\u00e7uk ka\u00e7\u0131k bir \u015fey yok. Tek yapt\u0131\u011f\u0131 lvalue ya da rvalue bir parametre al\u0131p herhangi bir kopya olu\u015fturucu \u00e7a\u011f\u0131rmadan rvalue olarak bu parametreyi d\u00f6nmektir. A\u015fa\u011f\u0131da \u00f6rnek olabilecek bir kullan\u0131m g\u00f6sterilmi\u015ftir.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:c++ decode:true\">template &lt;class T&gt;\r\ntypename remove_reference&lt;T&gt;::type&amp;&amp;\r\nmove(T&amp;&amp; a)\r\n{\r\n    return a;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Evet bir yaz\u0131m\u0131z\u0131n daha sonun geldik. Asl\u0131nda bu yaz\u0131 ile birlikte C++ 11 e dair lambda&#8217;lar d\u0131\u015f\u0131nda b\u00fcy\u00fck b\u00fct\u00fcn yenilikleri tamamlad\u0131k. Bunlar d\u0131\u015f\u0131nda STL&#8217;de gelen bir tak\u0131m yenilikler var ama onlara da bir yaz\u0131 ile bakar\u0131z. Hayd\u0131 kal\u0131n sa\u011fl\u0131cakla.<\/p>\n<h2><span style=\"color: #0000ff;\">Kaynaklar<\/span><\/h2>\n<p><a href=\"http:\/\/www.bogotobogo.com\/cplusplus\/C11\/5_C11_Move_Semantics_Rvalue_Reference.php\">C++11\/C++14 5. RVALUE REFERENCE AND MOVE SEMANTICS<\/a><\/p>\n<p><a href=\"https:\/\/mbevin.wordpress.com\/2012\/11\/20\/move-semantics\/\">Lesson #5: Move&nbsp;Semantics<\/a><\/p>\n<p><a href=\"http:\/\/thbecker.net\/articles\/rvalue_references\/section_01.html\">C++ Rvalue References Explained<\/a><\/p>\n<p><a href=\"https:\/\/www.codeproject.com\/Articles\/570638\/Ten-Cplusplus-Features-Every-Cplusplus-Developer#movesemantics\"> Ten C++11 Features Every C++ Developer Should Use<\/a><\/p>\n<p><a href=\"https:\/\/www.cprogramming.com\/c++11\/rvalue-references-and-move-semantics-in-c++11.html\">Move semantics and rvalue references in C++11<\/a><\/p>\n<p><a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2006\/n2027.html\">A Brief Introduction to Rvalue References<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Evet bir di\u011fer Modern C++ 11 ile yaz\u0131m\u0131z ile tekrar birlikteyiz. Bu yaz\u0131m\u0131zda C++ 11 ile gelen \u00f6nemli de\u011fi\u015fikliklerden biri olan &#8220;Move Semantics&#8221; yani Ta\u015f\u0131ma Semantiklerinden sizlere bahsedece\u011fim. Bu konu da derya deniz bir konu. Bu yaz\u0131mda sadece \u00f6nemli hususlar\u0131n \u00fczerinden ge\u00e7ip, genel mant\u0131\u011f\u0131 sizlere aktar\u0131p, kalan\u0131n\u0131 na\u00e7izane sizlere b\u0131rakaca\u011f\u0131m \ud83d\ude42 Daha lambda&#8217;lar var garda\u015f\u0131m&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41],"tags":[13,46,107,104,42,106,109,108,103,105],"class_list":["post-326","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","tag-c","tag-c-11","tag-forward","tag-lvalue","tag-modern-c","tag-move","tag-move-semantics-rvalue-references","tag-perfect-forwarding","tag-rvalue","tag-stdmove"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Modern C++ (5) : Ta\u015f\u0131ma Semantikleri - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Modern C++ (5) : Ta\u015f\u0131ma Semantikleri[:en]Modern C++ (5) : Move semantics [:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet bir di\u011fer Modern C++ 11 ile yaz\u0131m\u0131z ile tekrar birlikteyiz. Bu yaz\u0131m\u0131zda C++ 11 ile gelen \u00f6nemli de\u011fi\u015fikliklerden biri olan &#8220;Move Semantics&#8221; yani Ta\u015f\u0131ma Semantiklerinden sizlere bahsedece\u011fim. Bu konu da derya deniz bir konu. Bu yaz\u0131mda sadece \u00f6nemli hususlar\u0131n \u00fczerinden ge\u00e7ip, genel mant\u0131\u011f\u0131 sizlere aktar\u0131p, kalan\u0131n\u0131 na\u00e7izane sizlere b\u0131rakaca\u011f\u0131m \ud83d\ude42 Daha lambda&#8217;lar var garda\u015f\u0131m... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2018-03-16T19:48:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-12-29T15:14:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\"},\"headline\":\"Modern C++ (5) : Ta\u015f\u0131ma Semantikleri\",\"datePublished\":\"2018-03-16T19:48:25+00:00\",\"dateModified\":\"2019-12-29T15:14:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\"},\"wordCount\":2489,\"commentCount\":8,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"C++ 11\",\"forward\",\"lvalue\",\"Modern C++\",\"move\",\"move semantics rvalue references\",\"perfect forwarding\",\"rvalue\",\"std::move\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\",\"name\":\"[:tr]Modern C++ (5) : Ta\u015f\u0131ma Semantikleri[:en]Modern C++ (5) : Move semantics [:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2018-03-16T19:48:25+00:00\",\"dateModified\":\"2019-12-29T15:14:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Modern C++ (5) : Ta\u015f\u0131ma Semantikleri\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"description\":\"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Modern C++ (5) : Ta\u015f\u0131ma Semantikleri[:en]Modern C++ (5) : Move semantics [:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Modern C++ (5) : Ta\u015f\u0131ma Semantikleri[:en]Modern C++ (5) : Move semantics [:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet bir di\u011fer Modern C++ 11 ile yaz\u0131m\u0131z ile tekrar birlikteyiz. Bu yaz\u0131m\u0131zda C++ 11 ile gelen \u00f6nemli de\u011fi\u015fikliklerden biri olan &#8220;Move Semantics&#8221; yani Ta\u015f\u0131ma Semantiklerinden sizlere bahsedece\u011fim. Bu konu da derya deniz bir konu. Bu yaz\u0131mda sadece \u00f6nemli hususlar\u0131n \u00fczerinden ge\u00e7ip, genel mant\u0131\u011f\u0131 sizlere aktar\u0131p, kalan\u0131n\u0131 na\u00e7izane sizlere b\u0131rakaca\u011f\u0131m \ud83d\ude42 Daha lambda&#8217;lar var garda\u015f\u0131m... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2018-03-16T19:48:25+00:00","article_modified_time":"2019-12-29T15:14:36+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4"},"headline":"Modern C++ (5) : Ta\u015f\u0131ma Semantikleri","datePublished":"2018-03-16T19:48:25+00:00","dateModified":"2019-12-29T15:14:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/"},"wordCount":2489,"commentCount":8,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","C++ 11","forward","lvalue","Modern C++","move","move semantics rvalue references","perfect forwarding","rvalue","std::move"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/","name":"[:tr]Modern C++ (5) : Ta\u015f\u0131ma Semantikleri[:en]Modern C++ (5) : Move semantics [:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2018-03-16T19:48:25+00:00","dateModified":"2019-12-29T15:14:36+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Modern C++ (5) : Ta\u015f\u0131ma Semantikleri"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}},{"@type":"Person","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/30ee263812776c4abb84418d028b5ef4","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1fba597722a6cfbfac6eb03b348b1f5065b583004abb13322f432c3f00276b3f?s=96&d=wp_user_avatar&r=g","caption":"yaz\u0131l\u0131mperver"},"description":"\u00d6\u011frenmeyi ve payla\u015fmay\u0131 seven bir yaz\u0131l\u0131mperver :)"}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=326"}],"version-history":[{"count":6,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/326\/revisions"}],"predecessor-version":[{"id":1592,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/326\/revisions\/1592"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}