{"id":4793,"date":"2008-10-28T12:31:00","date_gmt":"2008-10-28T12:31:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2008\/10\/28\/lambdas-auto-and-static_assert-c0x-features-in-vc10-part-1\/"},"modified":"2019-02-18T18:53:59","modified_gmt":"2019-02-18T18:53:59","slug":"lambdas-auto-and-static_assert-c0x-features-in-vc10-part-1","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/lambdas-auto-and-static_assert-c0x-features-in-vc10-part-1\/","title":{"rendered":"Lambdas, auto, and static_assert: C++0x Features in VC10, Part 1"},"content":{"rendered":"<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">The Visual C++ compiler in the Microsoft Visual Studio 2010 September Community Technology Preview (CTP) contains support for <b>four<\/b> C++0x language features, namely <b>lambdas<\/b>, <b>auto<\/b>, <b>static_assert<\/b>, and <b>rvalue references<\/b>.&nbsp; Today, I&#8217;m going to explain the first three features in detail.&nbsp; (And I&#8217;m going to dedicate an entire post to explaining rvalue references in the near future, simply because explaining them now would double the length of this already very long post.)<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">First, a few quick things:<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">1. Today&#8217;s post is brought to you by Stephan T. Lavavej, Visual C++ Libraries Developer, and the letters C, A, and T.&nbsp; Note that as a libraries dev, I didn&#8217;t implement these features.&nbsp; That was the work of Jonathan Caves, front-end compiler dev, voting Standardization Committee member, and all-around ninja.<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">2. I refer to the Visual C++ compiler in VS 2010 as VC10 (VS 2008 contained VC9, VS 2005 contained VC8, etc. &#8211; 10 is not short for 2010).<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">3. C++0x refers to the upcoming C++ Standard, which is still being drafted.&nbsp; (The Standardization Committee hopes that they&#8217;ll be finished in 2009, making it C++09; the joke is that if it slips to 2010 or later, the &#8216;x&#8217; will be hexadecimal.)&nbsp; C++98 and C++03 refer to the current C++ Standard.&nbsp; (Without going into a history lecture here, the 2003 C++ Standard was merely a &#8220;service pack&#8221; for the original 1998 C++ Standard, and most people can disregard the differences.&nbsp; C++03 and C++0x are totally different, despite appearances.)<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">4. I&#8217;d like to thank the Standardization Committee for developing these wonderfully useful and well-crafted features.&nbsp; They also make important documents available on their website:<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">C++0x language feature status: <\/font><a href=\"http:\/\/open-std.org\/JTC1\/SC22\/WG21\/docs\/papers\/2008\/n2705.html\"><font face=\"Verdana\" color=\"#0000ff\" size=\"3\">http:\/\/open-std.org\/JTC1\/SC22\/WG21\/docs\/papers\/2008\/n2705.html<\/font><\/a><\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">C++0x library feature status: <\/font><a href=\"http:\/\/open-std.org\/JTC1\/SC22\/WG21\/docs\/papers\/2008\/n2706.html\"><font face=\"Verdana\" color=\"#0000ff\" size=\"3\">http:\/\/open-std.org\/JTC1\/SC22\/WG21\/docs\/papers\/2008\/n2706.html<\/font><\/a><\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">C++0x Working Draft: <\/font><a href=\"http:\/\/open-std.org\/JTC1\/SC22\/WG21\/docs\/papers\/2008\/n2798.pdf\"><font face=\"Verdana\" color=\"#0000ff\" size=\"3\">http:\/\/open-std.org\/JTC1\/SC22\/WG21\/docs\/papers\/2008\/n2798.pdf<\/font><\/a><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">5. There are always bugs (although hopefully not too many), which is the whole point of the CTP.&nbsp; Please report bugs to us via Microsoft Connect.<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">Now, let&#8217;s look at the features!<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><b><font size=\"3\"><font face=\"Verdana\">lambdas<\/p>\n<p><\/font><\/font><\/b><\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">In C++0x, &#8220;lambda expressions&#8221; implicitly define and construct unnamed function objects, which then behave like handwritten function objects.&nbsp; This is the &#8220;Hello, World&#8221; lambda:<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;type meow.cpp<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;algorithm&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;iostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;ostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;vector&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">using namespace std;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">int main() {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; vector&lt;int&gt; v;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; ++i) {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.push_back(i);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for_each(v.begin(), v.end(), <b>[](int n) { cout &lt;&lt; n &lt;&lt; &#8221; &#8220;; }<\/b>);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">}<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;cl \/EHsc \/nologo \/W4 meow.cpp &gt; NUL &amp;&amp; meow<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">0 1 2 3 4 5 6 7 8 9<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Verdana\">The <\/font><span>[]<\/span><font face=\"Verdana\"> is the <i>lambda-introducer<\/i>, which tells the compiler that a lambda expression is beginning.&nbsp; The <\/font><span>(int n)<\/span><font face=\"Verdana\"> is the <i>lambda-parameter-declaration<\/i>, which tells the compiler what the unnamed function object class&#8217;s function call operator should take. &nbsp;Finally, the <\/font><span>{ cout &lt;&lt; n &lt;&lt; &#8221; &#8220;; }<\/span><font face=\"Verdana\"> is the <i>compound-statement<\/i> which serves as the body of the unnamed function object class&#8217;s function call operator.&nbsp; By default, the unnamed function object class&#8217;s function call operator returns <\/font><span>void<\/span><font face=\"Verdana\">.<\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">So, C++0x has mentally translated this into what you&#8217;d write in C++98:<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;type meow98.cpp<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;algorithm&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;iostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;ostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;vector&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">using namespace std;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">struct LambdaFunctor {<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp; void operator()(int n) const {<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; n &lt;&lt; &#8221; &#8220;;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">};<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">int main() {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; vector&lt;int&gt; v;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; ++i) {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.push_back(i);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for_each(v.begin(), v.end(), <b>LambdaFunctor()<\/b>);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">}<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;cl \/EHsc \/nologo \/W4 meow98.cpp &gt; NUL &amp;&amp; meow98<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">0 1 2 3 4 5 6 7 8 9<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Verdana\">Now I&#8217;m going to stop saying things like &#8220;the unnamed function object class&#8217;s function call operator returns <\/font><span>void<\/span><font face=\"Verdana\">&#8221; and start saying &#8220;the lambda returns <\/font><span>void<\/span><font face=\"Verdana\">&#8220;, but it&#8217;s important to remember what lambda expressions are doing: defining classes and constructing objects.<\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">Of course, the <i>compound-statement<\/i> of a lambda can contain multiple statements:<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;type multimeow.cpp<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;algorithm&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;iostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;ostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;vector&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">using namespace std;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">int main() {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; vector&lt;int&gt; v;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; ++i) {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.push_back(i);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for_each(v.begin(), v.end(), <b>[](int n) {<\/p>\n<p><\/b><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; n;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n % 2 == 0) {<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &#8221; even &#8220;;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &#8221; odd &#8220;;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><b><span>&nbsp;&nbsp;&nbsp; }<\/span><\/b><span>);<\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">}<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;cl \/EHsc \/nologo \/W4 multimeow.cpp &gt; NUL &amp;&amp; multimeow<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">0 even 1 odd 2 even 3 odd 4 even 5 odd 6 even 7 odd 8 even 9 odd<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Verdana\">Now, lambdas don&#8217;t always have to return <\/font><span>void<\/span><font face=\"Verdana\">.&nbsp; If a lambda&#8217;s <i>compound-statement<\/i> is <\/font><span>{ return <\/span><i><font face=\"Verdana\">expression<\/font><\/i><span>; }<\/span><font face=\"Verdana\"> , then the lambda&#8217;s return type will be automatically deduced to be the type of <i>expression<\/i>:<\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;type cubicmeow.cpp<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;algorithm&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;deque&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;iostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;iterator&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;ostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;vector&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">using namespace std;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">int main() {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; vector&lt;int&gt; v;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; ++i) {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.push_back(i);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; deque&lt;int&gt; d;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; transform(v.begin(), v.end(), front_inserter(d), <b>[](int n) { return n * n * n; }<\/b>);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for_each(d.begin(), d.end(), [](int n) { cout &lt;&lt; n &lt;&lt; &#8221; &#8220;; });<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">}<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;cl \/EHsc \/nologo \/W4 cubicmeow.cpp &gt; NUL &amp;&amp; cubicmeow<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">729 512 343 216 125 64 27 8 1 0<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Verdana\">Here, the type of <\/font><span>n * n * n<\/span><font face=\"Verdana\"> is <\/font><span>int<\/span><font face=\"Verdana\">, so this lambda&#8217;s function call operator returns <\/font><span>int<\/span><font face=\"Verdana\">.<\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font face=\"Verdana\" size=\"3\">Lambdas with more complicated <i>compound-statement<\/i>s don&#8217;t get automatically deduced return types.&nbsp; You have to explicitly specify them:<\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;type returnmeow.cpp<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;algorithm&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;deque&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;iostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;iterator&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;ostream&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">#include &lt;vector&gt;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">using namespace std;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">int main() {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; vector&lt;int&gt; v;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; ++i) {<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.push_back(i);<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; deque&lt;double&gt; d;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; transform(v.begin(), v.end(), front_inserter(d), <b>[](int n) -&gt; double {<\/p>\n<p><\/b><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n % 2 == 0) {<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n * n * n;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n \/ 2.0;<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><b><span><font size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><b><span>&nbsp;&nbsp;&nbsp; }<\/span><\/b><span>);<\/p>\n<p><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; for_each(d.begin(), d.end(), [](double x) { cout &lt;&lt; x &lt;&lt; &#8221; &#8220;; });<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">}<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p><font size=\"3\">&nbsp;<\/font><\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">C:Temp&gt;cl \/EHsc \/nologo \/W4 returnmeow.cpp &gt; NUL &amp;&amp; returnmeow<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font size=\"3\">4.5 512 3.5 216 2.5 64 1.5 8 0.5 0<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Verdana\">The <\/font><span>-&gt; double<\/span><font face=\"Verdana\"> is the optional <i>lambda-return-type-clause<\/i>.&nbsp; Why doesn&#8217;t it go on the left, like what programmers have been doing with C functions for longer than I&#8217;ve been alive?&nbsp; Because then the <i>lambda-introducer<\/i> wouldn&#8217;t come first, and that&#8217;s what tells the compiler that a lambda expression is beginning.&nbsp; (Figuring out this kind of stuff is what the Core Working Group excels at; trying to imagine whether a given construct would be parseable within C++ hurts my head.)<\/font><\/font><\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\">\n<p><font face=\"Verdana\" size=\"3\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><font size=\"3\"><font face=\"Verdana\">If you forget the <i>lambda-return-type-clause<\/i>, the compiler will complain <\/font><\/font><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Visual C++ compiler in the Microsoft Visual Studio 2010 September Community Technology Preview (CTP) contains support for four C++0x language features, namely lambdas, auto, static_assert, and rvalue references.&nbsp; Today, I&#8217;m going to explain the first three features in detail.&nbsp; (And I&#8217;m going to dedicate an entire post to explaining rvalue references in the near [&hellip;]<\/p>\n","protected":false},"author":289,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4793","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>The Visual C++ compiler in the Microsoft Visual Studio 2010 September Community Technology Preview (CTP) contains support for four C++0x language features, namely lambdas, auto, static_assert, and rvalue references.&nbsp; Today, I&#8217;m going to explain the first three features in detail.&nbsp; (And I&#8217;m going to dedicate an entire post to explaining rvalue references in the near [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/289"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=4793"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4793\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=4793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=4793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=4793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}