<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Van's House</title><link>http://blogs.msdn.com/b/xiangfan/</link><description>I&amp;#39;m a developer at C++ team. I&amp;#39;m interested in everything related to C++</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>Debug vs Release - v2</title><link>http://blogs.msdn.com/b/xiangfan/archive/2013/03/25/debug-vs-release-v2.aspx</link><pubDate>Tue, 26 Mar 2013 03:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10405292</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10405292</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10405292</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2013/03/25/debug-vs-release-v2.aspx#comments</comments><description>&lt;p&gt;Four and half a year ago (how time flies), I wrote a &lt;a href="http://blogs.msdn.com/b/xiangfan/archive/2008/08/30/debug-vs-release.aspx"&gt;post&lt;/a&gt; about the potential issues mixing debug and release CRT in the same program.&lt;/p&gt;
&lt;p&gt;At the end, it says, 'It's fortunate that this is a linker error. Otherwise, you'll waste lots of time in debugging to find out the subtle incompatibility'. Today, in v2, I'd like to share another example which I encountered in real-world code that demonstrates the subtle incompatibility.&lt;/p&gt;
&lt;p&gt;Here are the two source files, which are used to generate a dll and an exe:&lt;/p&gt;
&lt;p&gt;dll.cpp&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;__declspec&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;dllexport&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;useenv();&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="color: #0000ff;"&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515;"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;useenv()&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;wchar_t&lt;/span&gt;&amp;nbsp;*value;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;errno_t&lt;/span&gt;&amp;nbsp;err&amp;nbsp;=&amp;nbsp;_wdupenv_s(&amp;amp;value,&amp;nbsp;&lt;span style="color: #0000ff;"&gt;nullptr&lt;/span&gt;,&amp;nbsp;L&lt;span style="color: #a31515;"&gt;"ENV"&lt;/span&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&amp;nbsp;(err&amp;nbsp;==&amp;nbsp;0)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wprintf(L&lt;span style="color: #a31515;"&gt;"ENV&amp;nbsp;=&amp;nbsp;%s\n"&lt;/span&gt;,&amp;nbsp;value);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free(value);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;exe.cpp&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515;"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;__declspec&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;dllimport&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;useenv();&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&amp;nbsp;setenv(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;wchar_t&lt;/span&gt;&amp;nbsp;*&lt;span style="color: #808080;"&gt;value&lt;/span&gt;)&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_wputenv_s(L&lt;span style="color: #a31515;"&gt;"ENV"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #808080;"&gt;value&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;nbsp;main()&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setenv(L&lt;span style="color: #a31515;"&gt;"1"&lt;/span&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;useenv();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setenv(L&lt;span style="color: #a31515;"&gt;"2"&lt;/span&gt;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;useenv();&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;Build the program using the following command line:&lt;/p&gt;
&lt;p&gt;cl dll.cpp /MDd /LD /nologo&lt;br /&gt;cl exe.cpp /MD /nologo /link dll.lib&lt;/p&gt;
&lt;p&gt;What output would you expect? If everything goes as expected, it should output '1' and '2' on two lines.&lt;/p&gt;
&lt;p&gt;However, if you try the example above, the actual output are two '1's. Unlike linker errors, this kind of runtime issues is much harder to find and the fix normally involves changes to the build system / project files which are normally non-trivial.&lt;/p&gt;
&lt;p&gt;Now, let's take a closer look at the example.&lt;/p&gt;
&lt;p&gt;The magic is in the compiler options. The dll is compiled with /MDd (debug CRT) and the exe is compiled with /MD (release CRT). So 'setenv' calls '_wputenv_s' from release CRT, and 'useenv' calls '_wdupenv_s' from debug CRT,&lt;/p&gt;
&lt;p&gt;'Why does this matter?', you may ask. This is because CRT maintains many global states internally. Debug CRT and release CRT both have their own copies, changes to one don't affect the other.&lt;/p&gt;
&lt;p&gt;In this case, CRT maintains a cache to the wide string version of the environment variables and the cache is created when you access the environment variable for the first time. The complete process can be illustrated as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first 'setenv' calls OS API to set the environment variables of the process and they are also cached in the release CRT.&lt;/li&gt;
&lt;li&gt;The first 'useenv' tries to read the environment variables and they are not cached in the debug CRT yet. So it reads them from OS and creates the cache.&lt;/li&gt;
&lt;li&gt;The second 'setenv' calls OS API and also updates the cached environment variables in the release CRT.&lt;/li&gt;
&lt;li&gt;The second 'useenv' reads the environment variables directly from the cache in the debug CRT which are not changed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the bug only appears when you call 'useenv' the second time because the cache is created but not correctly updated (I'm not sure whether the behavior of CRT is by-design, but apparently it assumes one CRT in the binary and no direct call to SetEnvironmentString).&lt;/p&gt;
&lt;p&gt;It is much more subtle than always fail. Actually it took me quite a while to have a small example from the original code. The first few attempts always output '(null)' instead and you can easily know that sometime goes wrong from that :-)&lt;/p&gt;
&lt;p&gt;This is just one of thousands of possibilities how mixing debug and release CRT (or any components compiled with different options) can mess up things. The best practice is to make sure everything is compiled with the same compiler options, but this is not always possible (for example, some libraries are from third party). Then you'd better be very cautious about mixing them in the same binary. Move the incompatible part to a separate dll with an abstract layer (so that there are no assumptions across binary boundary) may help.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10405292" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/Bug/">Bug</category></item><item><title>Connect Bugs that I Fixed</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/12/28/compiler-bugs-i-fixed.aspx</link><pubDate>Fri, 28 Dec 2012 22:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10381219</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10381219</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10381219</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/12/28/compiler-bugs-i-fixed.aspx#comments</comments><description>&lt;p&gt;Similar&amp;nbsp;to STL's post on &lt;a title="vcblog" href="http://blogs.msdn.com/b/vcblog/archive/2012/08/10/10338661.aspx"&gt;vcblog&lt;/a&gt;, I generate a table of connect bugs&amp;nbsp;that I have fixed after I officially worked on the compiler front end:&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connect ID&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/581680"&gt;581680&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Lambda declaration cannot access closure variables when defined as a&lt;br /&gt;&amp;nbsp; member function of an inline class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/584664"&gt;584664&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Visual C++ compiler crashes while trying to compile some templates &amp;amp;&lt;br /&gt;&amp;nbsp; inheritance code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/611359"&gt;611359&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ compiler: Temporary object created when it should not, thus making&lt;br /&gt;&amp;nbsp; code that worked in VC9 not work anymore!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/612158"&gt;612158&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Illegal C++ fails to generate C2039 error, allowing buffer overrun&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/619198"&gt;619198&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[c++] Compiler fails to deduce template parameter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/622382"&gt;622382&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fatal error C1001: An internal error has occurred in the compiler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/622723"&gt;622723&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Const pointer sign extension not consistent in 64-bit compiler.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/623481"&gt;623481&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Compiler crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/624283"&gt;624283&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Private copy operator vs __declspec(dllexport)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/624378"&gt;624378&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Can I double&amp;amp;&amp;amp; in template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/624757"&gt;624757&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Incorrect function template deduction involving pointor to member data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/625710"&gt;625710&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Compilation error in case of repeating forward declaration within class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/633274"&gt;633274&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ compiler allows use of unspecialized member function template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/633782"&gt;633782&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ #pragma secion doesn't allow read,write,execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/634671"&gt;634671&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Bug with operator overloading and nested lambdas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/634688"&gt;634688&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Wrong return type when running nested lambda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/634966"&gt;634966&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Argument dependent lookup chooses the wrong function inside sizeof&lt;br /&gt;&amp;nbsp; statements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/636634"&gt;636634&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Unexpected error C2751 reported at 'using namespace' directive inside a&lt;br /&gt;&amp;nbsp; lambda expression.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/637539"&gt;637539&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;using namespace a::b; does not work in a lambda defined on the root&lt;br /&gt;&amp;nbsp; level.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/640228"&gt;640228&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;compiler template declaration/definition mismatch error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/640281"&gt;640281&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++/CLI compiler crashes when attempting to compile event&lt;br /&gt;&amp;nbsp; System::EventHandler&amp;lt;&amp;gt;;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/640356"&gt;640356&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;decltype does not seem to work ok with operator, expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/641032"&gt;641032&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Lambda's automagic ctor gets wrong signature (or call) when implicit and&lt;br /&gt;&amp;nbsp; explicit capture is mixed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/649496"&gt;649496&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Visual C++ doesn't respect the access modifier for operator member&lt;br /&gt;&amp;nbsp; function templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/649953"&gt;649953&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Incorrect code generated when returning struct by value and compiling for&lt;br /&gt;&amp;nbsp; x86.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/650667"&gt;650667&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Incorrect IDE error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/651255"&gt;651255&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ CLI property overriding and renaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/657040"&gt;657040&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Buggy static_assert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/661294"&gt;661294&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Wrong "this" pointer when using templates in C++ and targeting&lt;br /&gt;&amp;nbsp; x64 Platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/663659"&gt;663659&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Large arrays with const size can crash at run-time on win64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/663884"&gt;663884&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;VC10: weird template deduction error with non-type default template&lt;br /&gt;&amp;nbsp; argument&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/667226"&gt;667226&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;private template operators in C++ treated as public&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/668375"&gt;668375&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Unexpected error for legal code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/669603"&gt;669603&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;std algorithm functions do not compile in certain case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/674241"&gt;674241&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ Lambda unable to access parts of types in containing method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/674442"&gt;674442&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Enumeration with negative values are popping C4341 warnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/674672"&gt;674672&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Callee disassembly expects address which caller is not providing in x64&lt;br /&gt;&amp;nbsp; mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/675321"&gt;675321&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fatal error C1001: An internal error has occurred in the compiler.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/676037"&gt;676037&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CL crashes while compiling specific line (see description)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/678194"&gt;678194&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;decltype strips "member" property from member function pointers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/678295"&gt;678295&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ compiler loses member-ness of pointer-to-member-function during&lt;br /&gt;&amp;nbsp; template deduction, causes ICE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/679623"&gt;679623&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Incorrectly duplicating object when it is a native one(NDT) in&lt;br /&gt;&amp;nbsp; vs2010sp1(C++)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/679716"&gt;679716&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Bug in VC++ 2010 with global refence to array&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/684720"&gt;684720&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++: Inconsistent explicit interface override behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/684900"&gt;684900&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;template template parameters don't work with unions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/684807"&gt;684807&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2216 'override' cannot be used with 'inline'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/685461"&gt;685461&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ compiler bug in certain situation involving using declaration and&lt;br /&gt;&amp;nbsp; overloaded base member functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/686324"&gt;686324&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;cl static assertion parsing error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/687345"&gt;687345&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Local class and lambda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/687935"&gt;687935&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Ambiguous call to overloaded function in c++ when using lambdas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/688106"&gt;688106&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Fatal Error C1001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/688107"&gt;688107&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2466 emitted twice for the same construct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/688198"&gt;688198&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Invalid error error C2871 when using functions defined within nested&lt;br /&gt;&amp;nbsp; namespaced in lambdas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/688443"&gt;688443&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2143 emitted twice for the same construct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/689504"&gt;689504&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2326 on Lambdas with [this]-Capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/689815"&gt;689815&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;std::result_of not working with lambdas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/696310"&gt;696310&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C2027 emitted multiple times compiling deque with an incomplete stored&lt;br /&gt;&amp;nbsp; class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/696412"&gt;696412&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Compiling local static auto object causes internal compiler error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/697086"&gt;697086&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;VC++ cannot resolve function overload as template parameter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/697006"&gt;697006&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C4430 emitted twice for the same construct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/697512"&gt;697512&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Internal compiler error while compiling specific initializer of global&lt;br /&gt;&amp;nbsp; object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/698459"&gt;698459&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;VS Stop Working in Win7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/698688"&gt;698688&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;auto compiler error with multiple name declaration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/704352"&gt;704352&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The function pointer types estimated by template are wrong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/704624"&gt;704624&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Memory leaks with lambda expressions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/706674"&gt;706674&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;compile error C2663 in lambda, if boost 1.48 posix_time.hpp is included.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/706537"&gt;706537&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;shared_ptr and lambda function crash with C1001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/715680"&gt;715680&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;D8030: INTERNAL COMPILER ERROR&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/716372"&gt;716372&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ - fatal error C1001 when using static local variable with non-trivial&lt;br /&gt;&amp;nbsp; constructor in static local lambda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/718297"&gt;718297&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Access private function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/718578"&gt;718578&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;VS2010 C++ Template Member Functions in Lambdas Error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/718729"&gt;718729&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[C++] Reference default argument falsely converted to pointer on&lt;br /&gt;&amp;nbsp; instantiation of more than 2 explicit specializations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/720670"&gt;720670&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ type equality not recognized under SFINAE context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/724319"&gt;724319&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Failed to compile program using boost::program_options and lambda&lt;br /&gt;&amp;nbsp; expression&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/724362"&gt;724362&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;decltype がサイズが 0 の配列への参照を作れる / decltype can generate references of zero&lt;br /&gt;&amp;nbsp; sized array&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/725056"&gt;725056&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;unable to match function definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/725189"&gt;725189&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Microsoft C++ compiler crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/725876"&gt;725876&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;decltype deduces wrong type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/729345"&gt;729345&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Rvalue reference overloading rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/732006"&gt;732006&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;auto -&amp;gt; decltype causes C1001 crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/736295"&gt;736295&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fatal error C1001 when using Lambda Expression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/736576"&gt;736576&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Incorrect name lookup in a lambda expression defined inside a class&lt;br /&gt;&amp;nbsp; member function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/736931"&gt;736931&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The explicit capture of an entity by a nested lambda-expression does not&lt;br /&gt;&amp;nbsp; cause its implicit capture by the containing lambda-expression.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/736965"&gt;736965&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;internal compiler error instead of compiler diagnostic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/711056"&gt;711056&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Friend Template Classes and Lambda Functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/741267"&gt;741267&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Visual Studio 2010 C++: Static objects imported via using directives in&lt;br /&gt;&amp;nbsp; lambdas cause compilation issues!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/743303"&gt;743303&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Initializer list in a lambda crashes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/746042"&gt;746042&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;It does not work to instantiate a template with two different anonymous&lt;br /&gt;&amp;nbsp; enums&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/746056"&gt;746056&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Error C1001 with range-based for-loop containing complex expression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/746135"&gt;746135&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;lambda expression problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/746680"&gt;746680&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Internal Compiler error (C1001) and sometimes crash with VS2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/747514"&gt;747514&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Inconsistent behavior when passing rvalue reference to function vs.&lt;br /&gt;&amp;nbsp; function pointer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/748530"&gt;748530&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Function pointer to templated function becomes that of non-templated&lt;br /&gt;&amp;nbsp; function of the same name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/750224"&gt;750224&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Visual Studio 2010, compiler crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/751729"&gt;751729&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;range-based for and shared_ptr internal error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/752136"&gt;752136&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Array&amp;lt;&amp;gt; deallocated too early&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/753113"&gt;753113&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;VS2012 C++ Compiler Crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/753699"&gt;753699&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++ compiler crashes instead of returning error for simple erroneous C++&lt;br /&gt;&amp;nbsp; code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/753981"&gt;753981&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Errors C2950 and C3416 are the same and shouldn't be errors at the first&lt;br /&gt;&amp;nbsp; place.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/754807"&gt;754807&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Possible minor bug in Visual C++ 2010/2012 regarding conditional operator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/759048"&gt;759048&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Compiler crash on C++ code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/759235"&gt;759235&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cannot build project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/760771"&gt;760771&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;fatal error C1001: An internal error has occurred in the compiler.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/761026"&gt;761026&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;XMMATRIX not properly aligned when using c++11 auto keyword.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/761148"&gt;761148&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Internal Compiler Error using const wchar_t* in inline method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/762838"&gt;762838&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Partial template specialization error with namespace &amp;amp; final&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/770391"&gt;770391&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Uniform Initialization Error with Nov 2012 CTP of Visual C++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/770526"&gt;770526&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[Codename Milan] Delegating constructors not working with explicit&lt;br /&gt;&amp;nbsp; constructors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/770888"&gt;770888&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;const ref to initializer_list is not recognized as valid ctor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/771018"&gt;771018&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CL crashes when compiel code with initializer_list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/771272"&gt;771272&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C/C++ Compiler Driver Crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/771311"&gt;771311&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Variadic template bug in vs2012 november CTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/771533"&gt;771533&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[Codename Milan] Regression making function operator public with using&lt;br /&gt;&amp;nbsp; statement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/771534"&gt;771534&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[Codename Milan] Regression - Warning 4554 erroneously emitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/772001"&gt;772001&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[Codename Milan] C++11 compilation issue (C2065)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/772093"&gt;772093&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;x86 C++ compiler crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/773505"&gt;773505&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;std::forward and variadic templates failed in Nov 2012 CTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/774153"&gt;774153&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[Codename Milan] Missing &amp;lt;initializer_list&amp;gt; include causes compiler&lt;br /&gt;&amp;nbsp; crash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/774268"&gt;774268&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Failure to bind rvalue to a constant reference when rvalue is returned&lt;br /&gt;&amp;nbsp; from virtual function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/774456"&gt;774456&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[Codename Milan] ambiguous begin()/end() of initilizer_list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/774527"&gt;774527&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;After upgraded from VS2008, build project in VS2012 shows error: c1xx :&lt;br /&gt;&amp;nbsp; fatal error C1083: Cannot open source file: '??????????????????????????????':&lt;br /&gt;&amp;nbsp; No such file or directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/775016"&gt;775016&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;[Codename Milan] std::forward ignore namespaces in variadic template&lt;br /&gt;&amp;nbsp; functions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These&amp;nbsp;are only a small portion of bugs we have fixed (less than 20% of mine), and there are still large amount of active bugs on which we are working.&lt;/p&gt;
&lt;p&gt;If you find any bugs in the compiler, feel free to report&amp;nbsp;them through&amp;nbsp;&lt;a href="http://connect.microsoft.com/VisualStudio"&gt;Microsoft Connect&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10381219" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/VC/">VC</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/Bug/">Bug</category></item><item><title>November CTP of Visual C++ compiler, more C++11 features</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/11/03/november-ctp-of-visual-c-compiler-more-c-11-features.aspx</link><pubDate>Sat, 03 Nov 2012 23:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10365570</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10365570</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10365570</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/11/03/november-ctp-of-visual-c-compiler-more-c-11-features.aspx#comments</comments><description>&lt;p&gt;Our team announced &lt;a href="http://blogs.msdn.com/b/vcblog/archive/2012/11/02/visual-c-c-11-and-the-future-of-c.aspx"&gt;Novemeber CTP of Visual C++ compiler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It contains the following C++11&amp;nbsp;features besides those already in VS2012:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Variadic templates&lt;/li&gt;
&lt;li&gt;Uniform initialization and initializer_lists&lt;/li&gt;
&lt;li&gt;Delegating constructors&lt;/li&gt;
&lt;li&gt;Raw string literals&lt;/li&gt;
&lt;li&gt;Explicit conversion operators&lt;/li&gt;
&lt;li&gt;Default template arguments for function templates&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10365570" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/VC/">VC</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_11/">C++11</category></item><item><title>System.Uri doesn’t allow trailing dot</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/02/06/system-uri-doesn-t-allow-trailing-dot.aspx</link><pubDate>Tue, 07 Feb 2012 06:19:58 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10264746</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10264746</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10264746</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/02/06/system-uri-doesn-t-allow-trailing-dot.aspx#comments</comments><description>&lt;p&gt;Again, System.Uri tries to be smart and does something on my behalf :-(&lt;/p&gt;
&lt;p&gt;This time, the victim is trailing dot (which is common in wiki pages). See this connect &lt;a title="bug" href="https://connect.microsoft.com/VisualStudio/feedback/details/386695/"&gt;bug&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;The workaround is similar to the one described in this &lt;a title="post" href="http://blogs.msdn.com/b/xiangfan/archive/2012/01/15/system-uri-doesn-t-allow-embedded-escaped-slashes.aspx"&gt;post&lt;/a&gt;. The only difference is that we need 'GenericUriParserOptions.DontCompressPath' instead.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10264746" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/Bug/">Bug</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2300_/">C#</category></item><item><title>C++: Under the Hood</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/02/06/c-under-the-hood.aspx</link><pubDate>Tue, 07 Feb 2012 03:32:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10264722</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10264722</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10264722</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/02/06/c-under-the-hood.aspx#comments</comments><description>&lt;p&gt;This is an article written by Jan Gray. It is quite old, but most of the contents still apply today.&lt;/p&gt;  &lt;p&gt;The original article on MSDN can no longer be found. Here is the pdf version on OpenRCE: &lt;a title="http://www.openrce.org/articles/files/jangrayhood.pdf" href="http://www.openrce.org/articles/files/jangrayhood.pdf"&gt;http://www.openrce.org/articles/files/jangrayhood.pdf&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Overview:&lt;/p&gt;  &lt;p&gt;How are classes laid out?    &lt;br /&gt;How are data members accessed?     &lt;br /&gt;How are member functions called?     &lt;br /&gt;What is an adjuster thunk?     &lt;br /&gt;What are the costs:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Of single, multiple, and virtual inheritance?     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Of virtual functions and virtual function calls?     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Of casts to bases, to virtual bases?     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Of exception handling?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10264722" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/VC/">VC</category></item><item><title>C++98 -&gt; C++11: Pass by value or pass by reference?</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/02/03/c-98-gt-c-11-pass-by-value-or-pass-by-reference.aspx</link><pubDate>Sat, 04 Feb 2012 03:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10263938</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10263938</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10263938</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/02/03/c-98-gt-c-11-pass-by-value-or-pass-by-reference.aspx#comments</comments><description>&lt;p&gt;In &lt;a href="http://channel9.msdn.com/Events/GoingNative/GoingNative-2012" target="_blank"&gt;GoingNative 2012&lt;/a&gt;, there are some discussions on the new coding style for C++11. One interesting thing which is mentioned by Bjarne Stroustrup, Stephan T. Lavavej and Herb Sutter is the most efficient way to pass the argument.&lt;/p&gt;
&lt;p&gt;In C++98, pass by reference is in general more efficient because it saves extra copies (if the copy is expensive, otherwise the extra indirection may hurt the perf instead). However, after the introduction of move semantics in C++11, the story is now a little different (Note that premature optimization doesn&amp;rsquo;t buy you anything, so the following is to give you a full picture of the new thought introduced in C++11, see the guidelines at the end and use it when appropriate)&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see the following example: &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515;"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515;"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; std; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; String { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;wchar_t&lt;/span&gt; *) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"ctor"&lt;/span&gt; &amp;lt;&amp;lt; endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; String &amp;amp;) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"copy ctor"&lt;/span&gt; &amp;lt;&amp;lt; endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String(String &amp;amp;&amp;amp;) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"move ctor"&lt;/span&gt; &amp;lt;&amp;lt; endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; f1(String s) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;String&amp;gt; v; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(std::move(s)); &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; f2(&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; String &amp;amp;s) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;String&amp;gt; v; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; v.push_back(s); &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; g() { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String s(L&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"f1(s)"&lt;/span&gt; &amp;lt;&amp;lt; endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f1(s); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"f1(L"")"&lt;/span&gt; &amp;lt;&amp;lt; endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f1(L&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"f2(s)"&lt;/span&gt; &amp;lt;&amp;lt; endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f2(s); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"f2(L"")"&lt;/span&gt; &amp;lt;&amp;lt; endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f2(L&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;); &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;If you run the code, you will find that 'f1' has one less copy ctor call for rvalue argument and the same&amp;nbsp; amount of copy ctor call for lvalue argument than 'f2', which means 'f1' is more efficient (assume that move ctor is much cheaper than copy ctor).&lt;/p&gt;
&lt;p&gt;The trick is as follows: for lvalue argument, 'f1' has one extra copy to pass the argument because it is by-value, while 'f2' has one extra copy to call push_back. So no difference; for rvalue argument, the compiler has to create a temporary 'String(L&amp;ldquo;&amp;rdquo;)' and pass the temporary to 'f1' or 'f2' anyway. Because 'f1' can take advantage of move ctor when the argument is a temporary (which is an rvalue), the costs to pass the argument are the same now for 'f1' and 'f2'.&lt;/p&gt;
&lt;p&gt;This means in C++11 we can get better performance by using pass-by-value approach when:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The parameter type supports move semantics.&lt;/li&gt;
&lt;li&gt;The cost of move constructor is much cheaper than the copy constructor (both the time and stack usage).&lt;/li&gt;
&lt;li&gt;Inside the function, the parameter type will be passed to another function or operation which supports both copy and move.&lt;/li&gt;
&lt;li&gt;It is common to pass a temporary as the argument.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One example for the above guidelines (no copies here!): &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000;"&gt;// Assume that Matrix has a cheap move ctor&lt;/span&gt; &lt;br /&gt;Matrix &lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;-(Matrix m) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #008000;"&gt;// Manipulate m&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; m; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;Matrix m = -(a + b);&lt;/p&gt;
&lt;p&gt;Note, I learn today (April 2nd, 2013) that 'return m;' is in general more efficient than 'return std::move(m);'. Both will use move constructor of Matrix, but the latter inhibits &lt;a href="http://en.wikipedia.org/wiki/NRVO"&gt;NRVO&lt;/a&gt; (which means the compiler can't eliminate&amp;nbsp;the call to the move constructor).&lt;/p&gt;
&lt;p&gt;They are&amp;nbsp;the same in the above example because&amp;nbsp;'operator-' returns function parameter. If you return a local variable instead of a function parameter, you can save one call to the move constructor.&lt;/p&gt;
&lt;p&gt;The criteria for copy / move constructor elision is in C++11 standard draft &lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf"&gt;n3485.pdf&lt;/a&gt;, 12.8 / 31:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; in a return statement in a function with a class return type, &lt;strong&gt;when the expression is the name of a non-volatile automatic object&lt;/strong&gt; (other than a function or catch-clause parameter) with the same cv-unqualified type as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function&amp;rsquo;s return value&lt;/p&gt;
&lt;p&gt;The complex two-stage overload resolution to choose move constructor when you return an lvalue object is in 12.8 / 32:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;When the criteria for elision of a copy operation are met or would be met save for the fact that the source object is a function parameter&lt;/strong&gt;, and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue. If overload resolution fails, or if the type of the first parameter of the selected constructor is not an rvalue reference to the object&amp;rsquo;s type (possibly cv-qualified), overload resolution is performed again, considering the object as an lvalue. [ Note: This two-stage overload resolution must be performed regardless of whether copy elision will occur. It determines the constructor&amp;nbsp;to be called if elision is not performed, and the selected constructor must be accessible even if the call is elided. &amp;mdash;end note ]&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10263938" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/Optimization/">Optimization</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_0x/">C++0x</category></item><item><title>System.Uri doesn’t allow embedded escaped slashes</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/01/15/system-uri-doesn-t-allow-embedded-escaped-slashes.aspx</link><pubDate>Sun, 15 Jan 2012 19:05:27 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10256915</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10256915</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10256915</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/01/15/system-uri-doesn-t-allow-embedded-escaped-slashes.aspx#comments</comments><description>&lt;p&gt;I use C# a lot to write small utilities and sometimes find that it is annoying to have to dig into the source code to figure out why .Net framework doesn’t work as I expected. This happens again when I am using LinkedIn API (BTW, this is the first &lt;a href="http://blogs.msdn.com/b/xiangfan/archive/2008/09/01/magic-behind-valuetype-equals.aspx" target="_blank"&gt;occurence&lt;/a&gt; of such experience).&lt;/p&gt;  &lt;p&gt;&lt;a href="https://developer.linkedin.com/documents/connections-api" target="_blank"&gt;LinkedIn API&lt;/a&gt; allows you to get the details of user’s connection using url like the following:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;http://api.linkedin.com/v1/people/url=http%3A%2F%2Fwww.linkedin.com%2Fin%2Flbeebe/connections&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;However, if you create a url like the above in C# and send the request to LinkedIn, the server will reject the request and complain about the wrong signature.&lt;/p&gt;  &lt;p&gt;I hit this kind of issue several times before (due to slightly different escaping rules between the requirement of &lt;a href="http://tools.ietf.org/html/rfc5849" target="_blank"&gt;oAuth 1.0&lt;/a&gt; 3.6 / 2 (&lt;a href="http://tools.ietf.org/html/rfc3986" target="_blank"&gt;RFC3986&lt;/a&gt;) and &lt;a href="http://msdn.microsoft.com/en-US/library/system.uri.escapeuristring.aspx" target="_blank"&gt;Uri.EscapeUriString&lt;/a&gt; in .Net 2.0 (&lt;a href="http://tools.ietf.org/html/rfc2396" target="_blank"&gt;RFC2396&lt;/a&gt;)). But this time, the root cause is different.&lt;/p&gt;  &lt;p&gt;After spending lots of time debugging by myself and searching the web later, I reached the following post: &lt;a title="http://connect.microsoft.com/VisualStudio/feedback/details/94109/" href="http://connect.microsoft.com/VisualStudio/feedback/details/94109/"&gt;http://connect.microsoft.com/VisualStudio/feedback/details/94109/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So it is clear that .Net framework explicitly alters the input url for ‘security’ reason. But it doesn’t expose the interface to allow the user to change this behavior (even if it is simply a parser flag called ‘GenericUriParserOptions.DontUnescapePathDotsAndSlashes’ which can be set internally).&lt;/p&gt;  &lt;p&gt;Well, I’m on my own to hack it. The workaround posted in the bug changes the parser flag for all Uri objects with the same url scheme, so I have to write a more isolated version:&lt;/p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;HackedUri&lt;/span&gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;const&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;GenericUriParserOptions&lt;/span&gt; c_Options =   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;GenericUriParserOptions&lt;/span&gt;.Default |   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;GenericUriParserOptions&lt;/span&gt;.DontUnescapePathDotsAndSlashes |   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;GenericUriParserOptions&lt;/span&gt;.Idn |   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;GenericUriParserOptions&lt;/span&gt;.IriParsing;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;readonly&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;GenericUriParser&lt;/span&gt; s_SyntaxHttp = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;GenericUriParser&lt;/span&gt;(c_Options);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;readonly&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;GenericUriParser&lt;/span&gt; s_SyntaxHttps = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;GenericUriParser&lt;/span&gt;(c_Options);   &lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;static&lt;/span&gt; HackedUri()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,128,0)"&gt;// Initialize the scheme&lt;/span&gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;FieldInfo&lt;/span&gt; fieldInfoSchemeName = &lt;span style="color: rgb(0,0,255)"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43,145,175)"&gt;UriParser&lt;/span&gt;).GetField(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;m_Scheme&amp;quot;&lt;/span&gt;, &lt;span style="color: rgb(43,145,175)"&gt;BindingFlags&lt;/span&gt;.Instance | &lt;span style="color: rgb(43,145,175)"&gt;BindingFlags&lt;/span&gt;.NonPublic);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (fieldInfoSchemeName == &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;throw&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;MissingFieldException&lt;/span&gt;(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;'m_Scheme' field not found&amp;quot;&lt;/span&gt;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fieldInfoSchemeName.SetValue(s_SyntaxHttp, &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;http&amp;quot;&lt;/span&gt;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fieldInfoSchemeName.SetValue(s_SyntaxHttps, &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;https&amp;quot;&lt;/span&gt;);   &lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;FieldInfo&lt;/span&gt; fieldInfoPort = &lt;span style="color: rgb(0,0,255)"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43,145,175)"&gt;UriParser&lt;/span&gt;).GetField(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;m_Port&amp;quot;&lt;/span&gt;, &lt;span style="color: rgb(43,145,175)"&gt;BindingFlags&lt;/span&gt;.Instance | &lt;span style="color: rgb(43,145,175)"&gt;BindingFlags&lt;/span&gt;.NonPublic);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (fieldInfoPort == &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;throw&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;MissingFieldException&lt;/span&gt;(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;'m_Port' field not found&amp;quot;&lt;/span&gt;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fieldInfoPort.SetValue(s_SyntaxHttp, 80);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fieldInfoPort.SetValue(s_SyntaxHttps, 443);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;Uri&lt;/span&gt; Create(&lt;span style="color: rgb(0,0,255)"&gt;string&lt;/span&gt; url)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;Uri&lt;/span&gt; result = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;Uri&lt;/span&gt;(url);   &lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (url.IndexOf(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;%2F&amp;quot;&lt;/span&gt;, &lt;span style="color: rgb(43,145,175)"&gt;StringComparison&lt;/span&gt;.OrdinalIgnoreCase) != -1)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;UriParser&lt;/span&gt; parser = &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;switch&lt;/span&gt; (result.Scheme.ToLowerInvariant())   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;case&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;http&amp;quot;&lt;/span&gt;:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parser = s_SyntaxHttp;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;break&lt;/span&gt;;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;case&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;https&amp;quot;&lt;/span&gt;:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; parser = s_SyntaxHttps;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;break&lt;/span&gt;;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (parser != &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,128,0)"&gt;// Associate the parser&lt;/span&gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(43,145,175)"&gt;FieldInfo&lt;/span&gt; fieldInfo = &lt;span style="color: rgb(0,0,255)"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43,145,175)"&gt;Uri&lt;/span&gt;).GetField(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;m_Syntax&amp;quot;&lt;/span&gt;, &lt;span style="color: rgb(43,145,175)"&gt;BindingFlags&lt;/span&gt;.Instance | &lt;span style="color: rgb(43,145,175)"&gt;BindingFlags&lt;/span&gt;.NonPublic);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (fieldInfo == &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;throw&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: rgb(43,145,175)"&gt;MissingFieldException&lt;/span&gt;(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;'m_Syntax' field not found&amp;quot;&lt;/span&gt;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fieldInfo.SetValue(result, parser);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; result;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;  &lt;br /&gt;  &lt;p&gt;However, I feel guilty for hacking.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10256915" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/Bug/">Bug</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2300_/">C#</category></item><item><title>Speed up iostream</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/01/12/speed-up-iostream.aspx</link><pubDate>Thu, 12 Jan 2012 17:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10256012</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10256012</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10256012</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/01/12/speed-up-iostream.aspx#comments</comments><description>&lt;p&gt;Throughput of iostream is considered much slower compared with its C counterpart.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;printf(&lt;span style="color: #a31515;"&gt;"1234567\n"&lt;/span&gt;); &lt;br /&gt;cout &amp;lt;&amp;lt; &lt;span style="color: #a31515;"&gt;"1234567" &lt;/span&gt;&amp;lt;&amp;lt; endl; &lt;br /&gt;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you iterate 10&lt;sup&gt;5&lt;/sup&gt; times, printf takes about 50ms while cout takes &amp;gt;1s. This looks quite annoying.&lt;/p&gt;
&lt;p&gt;After digging into the source of iostream (not an easy task :-) ), I finally figure out that the bottleneck is the implicit flush inside &amp;lsquo;endl&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;&amp;lsquo;endl&amp;rsquo; does more than outputting a single &amp;lsquo;\n&amp;rsquo;. The standard (C++03 27.6.2.7 / 5) says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Effects: Calls os.put(os.widen(&amp;rsquo;\n&amp;rsquo;) ), then os.flush().&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After eliminating the unnecessary flush, cout is even faster than printf in some cases!&lt;/p&gt;
&lt;p&gt;Here is the number (the time below is measured by redirecting the output to &amp;lsquo;nul&amp;rsquo;):&lt;/p&gt;
&lt;table style="width: 320px;" border="1" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;printf&lt;/td&gt;
&lt;td valign="top" width="120"&gt;&amp;ldquo;1234567\n&amp;rdquo;&lt;/td&gt;
&lt;td valign="top" width="120"&gt;&amp;ldquo;%d\n&amp;rdquo;, i&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;VC10&lt;/td&gt;
&lt;td valign="top" width="120"&gt;56ms&lt;/td&gt;
&lt;td valign="top" width="120"&gt;64ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;g++ 4.5.3&lt;/td&gt;
&lt;td valign="top" width="120"&gt;24ms&lt;/td&gt;
&lt;td valign="top" width="120"&gt;70ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/p&gt;
&lt;table style="width: 320px;" border="1" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;cout&lt;/td&gt;
&lt;td valign="top" width="120"&gt;&amp;ldquo;1234567\n&amp;rdquo;&lt;/td&gt;
&lt;td valign="top" width="120"&gt;i &amp;lt;&amp;lt; &amp;ldquo;\n&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;VC10&lt;/td&gt;
&lt;td valign="top" width="120"&gt;36ms&lt;/td&gt;
&lt;td valign="top" width="120"&gt;178ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;g++ 4.5.3&lt;/td&gt;
&lt;td valign="top" width="120"&gt;46ms&lt;/td&gt;
&lt;td valign="top" width="120"&gt;90ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/p&gt;
&lt;table style="width: 320px;" border="1" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;cout&lt;/td&gt;
&lt;td valign="top" width="120"&gt;&amp;ldquo;1234567&amp;rdquo; &amp;lt;&amp;lt; endl&lt;/td&gt;
&lt;td valign="top" width="120"&gt;i &amp;lt;&amp;lt; endl&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;VC10&lt;/td&gt;
&lt;td valign="top" width="120"&gt;1260ms&lt;/td&gt;
&lt;td valign="top" width="120"&gt;1420ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="80"&gt;g++ 4.5.3&lt;/td&gt;
&lt;td valign="top" width="120"&gt;520ms&lt;/td&gt;
&lt;td valign="top" width="120"&gt;550ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note that the standard requires the library not to use full-buffer for stdout&amp;nbsp;/ cout (if the destination is a file, then it is on), so you have to do it by yourself. Otherwise the performance will be very poor (10x slower). GCC turns on full-buffer even though this is non-conformant :-).&lt;/strong&gt;&lt;/p&gt;
&lt;p align="LEFT"&gt;C99 7.19.3 / 7: As initially opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #0000ff;"&gt;#ifdef&lt;/span&gt; _MSC_VER &lt;br /&gt;vector&amp;lt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&amp;gt; v(1024); &lt;br /&gt;cout.rdbuf()-&amp;gt;pubsetbuf(&amp;amp;v[0], v.size()); &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10256012" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/Optimization/">Optimization</category></item><item><title>Protected or Private II</title><link>http://blogs.msdn.com/b/xiangfan/archive/2012/01/07/protected-or-private-ii.aspx</link><pubDate>Sat, 07 Jan 2012 23:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10254299</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10254299</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10254299</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2012/01/07/protected-or-private-ii.aspx#comments</comments><description>&lt;p&gt;Someone reminds me that it has been nearly 2 years since my last blog post. How time flies!&lt;/p&gt;
&lt;p&gt;Many things happened during this period. I moved to Redmond and I&amp;rsquo;m now officially working on C++ compiler. The work is busy and also challenging.&lt;/p&gt;
&lt;p&gt;Recently, there was a thread in our internal discussion list which mentioned a way to bypass the access check in C++.&lt;/p&gt;
&lt;p&gt;I had a blog &lt;a href="http://blogs.msdn.com/b/xiangfan/archive/2008/10/16/protected-or-private.aspx" target="_blank"&gt;post&lt;/a&gt; which discusses how to access &amp;lsquo;protected&amp;rsquo; member. However, the approach is non-conformant and doesn&amp;rsquo;t work for &amp;lsquo;private&amp;rsquo;. The internal discussion points me to a &lt;a href="http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html" target="_blank"&gt;post&lt;/a&gt; which shows a conformant way to bypass the access check! The approach is creative and it makes me think how to improve it to be extensible and easier to use.&lt;/p&gt;
&lt;p&gt;The main idea is based on the following statement in the C++ standard (C++03, 14.7.2 / 8):&lt;/p&gt;
&lt;p&gt;The usual access checking rules do not apply to names used to specify explicit instantiations. [ &lt;i&gt;Note: &lt;/i&gt;In particular, the template arguments and names used in the function declarator (including parameter types, return types and exception specifications) may be private types or objects which would normally not be accessible and the template may be a member template or member function which would not normally be accessible. &lt;i&gt;&amp;mdash;end note &lt;/i&gt;]&lt;/p&gt;
&lt;p&gt;The tricky part is, even if you can use the private member in the template argument of explicit instantiation, you can&amp;rsquo;t declare an object of such a type because access check happens during the declaration. That means you can&amp;rsquo;t get back the member from the instantiated type directly. So we have to take advantage of global variable instead. But unlike the original post, there is no need to use base classes. The following code shows the idea:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #008000;"&gt;// AccessControlHack.h&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;typename&lt;/span&gt; T, &lt;span style="color: #0000ff;"&gt;typename&lt;/span&gt; F, F pf, F* ppf&amp;gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; C { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; init() { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppf = pf; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; 0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i; &lt;br /&gt;}; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;typename&lt;/span&gt; T, &lt;span style="color: #0000ff;"&gt;typename&lt;/span&gt; F, F pf, F* ppf&amp;gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; C&amp;lt;T, F, pf, ppf&amp;gt;::i = init(); &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000;"&gt;// S.h&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#include&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; S { &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; S() {i1 = 4;} &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; f1() {printf(&lt;span style="color: #a31515;"&gt;"Hello World 1\n"&lt;/span&gt;);} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; f2() {printf(&lt;span style="color: #a31515;"&gt;"Hello World 2\n"&lt;/span&gt;);} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i2; &lt;br /&gt;}; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; S::i2 = 15; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000;"&gt;// SHack.h (include S.h)&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt; SHack { &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SHack(S *p) : m_p(p) {} &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; f1(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; f2(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; get_i1(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; get_i2(); &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;typename&lt;/span&gt; T&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; VerifyPointer(T p); &lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; S *m_p; &lt;br /&gt;}; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000;"&gt;// SHack.cpp (include AccessControlHack.h)&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; (S::*gpf1)(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; (*gpf2)(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; S::*gpi1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; *gpi2; &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; C&amp;lt;S, &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; (S::*)(), &amp;amp;S::f1, &amp;amp;gpf1&amp;gt;; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#ifndef&lt;/span&gt; _MSC_VER &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; C&amp;lt;S, &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; (*)(), &amp;amp;S::f2, &amp;amp;gpf2&amp;gt;; &lt;span style="color: #008000;"&gt;// bug of VC&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; C&amp;lt;S, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; S::*, &amp;amp;S::i1, &amp;amp;gpi1&amp;gt;; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; C&amp;lt;S, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; *, &amp;amp;S::i2, &amp;amp;gpi2&amp;gt;; &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;template&lt;/span&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;typename&lt;/span&gt; T&amp;gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SHack::VerifyPointer(T p) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!p) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515;"&gt;"The pointer has not been initialized. Using hack class before main could lead to undefined behavior."&lt;/span&gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SHack::f1() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerifyPointer(gpf1); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (m_p-&amp;gt;*gpf1)(); &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; SHack::f2() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerifyPointer(gpf2); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (*gpf2)(); &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; SHack::get_i1() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerifyPointer(gpi1); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; m_p-&amp;gt;*gpi1; &lt;br /&gt;} &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; SHack::get_i2() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VerifyPointer(gpi1); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; *gpi2; &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;span style="color: #008000;"&gt;// Main.cpp (include SHack.h)&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; S s; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SHack sh(&amp;amp;s); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sh.f1(); &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#ifndef&lt;/span&gt; _MSC_VER &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SHack::f2(); &lt;br /&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&lt;span style="color: #a31515;"&gt;"%d\n"&lt;/span&gt;, sh.get_i1()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&lt;span style="color: #a31515;"&gt;"%d\n"&lt;/span&gt;, SHack::get_i2()); &lt;br /&gt;} &lt;br /&gt; &lt;/p&gt;
&lt;p&gt;The above code compiles and runs correctly using VC10 and GCC 4.5.3. Is this a defect in the standard? I have no idea :-)&lt;/p&gt;
&lt;p&gt;Some comments,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I find a bug in VC which incorrectly does access check on non-static member functions during explicit instantiation.&lt;/li&gt;
&lt;li&gt;Because the member pointer is initialized in the dynamic initializer for &amp;lsquo;C::i&amp;rsquo;, the approach has the dependency on initialization order of global variables which is not guaranteed across translation units. That is why I add a check in &amp;lsquo;VerifyPointer&amp;rsquo;.&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10254299" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category></item><item><title>C++0x features in VC2010 - nullptr</title><link>http://blogs.msdn.com/b/xiangfan/archive/2010/05/10/c-0x-features-in-vc2010-nullptr.aspx</link><pubDate>Mon, 10 May 2010 07:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10010051</guid><dc:creator>Xiang Fan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/rsscomments.aspx?WeblogPostID=10010051</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/xiangfan/commentapi.aspx?WeblogPostID=10010051</wfw:comment><comments>http://blogs.msdn.com/b/xiangfan/archive/2010/05/10/c-0x-features-in-vc2010-nullptr.aspx#comments</comments><description>&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;A href="http://blogs.msdn.com/xiangfan/archive/2010/05/09/c-0x-features-in-vc2010-summary.aspx" mce_href="http://blogs.msdn.com/xiangfan/archive/2010/05/09/c-0x-features-in-vc2010-summary.aspx"&gt;Summary Page&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;(&lt;B style="mso-bidi-font-weight: normal"&gt;n3090.pdf is the current working draft of C++0x standard, it is available at &lt;/B&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;A href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3090.pdf" mce_href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3090.pdf"&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'"&gt;&lt;FONT color=#0000ff&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3090.pdf&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;)&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 13pt 0in; mso-outline-level: 2" class=MsoNormal&gt;&lt;B&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; FONT-SIZE: 18pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial"&gt;What we have before C++0x&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;Everyone knows that null pointer value is NULL. In C++, NULL is defined as follows:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;#define&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; NULL&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;One interesting thing about '0', it can be converted to any pointer types. However, this is not true for 0’s underlying type 'int'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;This leads to big problem when template is involved. For example (It is simplified from std::make_shared):&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;template&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; &amp;lt;&lt;SPAN style="COLOR: blue"&gt;typename&lt;/SPAN&gt; T&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;struct&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; CtorWrapperUnary&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;template&lt;/SPAN&gt;&amp;lt;&lt;SPAN style="COLOR: blue"&gt;typename&lt;/SPAN&gt; U&amp;gt; T *&lt;SPAN style="COLOR: blue"&gt;operator&lt;/SPAN&gt;()(U u)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; T(u);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;};&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;struct&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; A {&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;A(&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; *) {}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;};&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;void&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; bar()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;CtorWrapperUnary&amp;lt;A&amp;gt; f;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;f(0); &lt;SPAN style="COLOR: green"&gt;// error C2664: 'A::A(int *)' : cannot convert parameter 1 from 'int' to 'int *'&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;The functor "CtorWrapperUnary" wraps the constructor of A. However, the functor can’t accept argument '0' while A’s constructor can. The root cause is that the special property of '0' is lost when it is converted to a variable 'u' of type 'int'.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 13pt 0in; mso-outline-level: 2" class=MsoNormal&gt;&lt;B&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; FONT-SIZE: 18pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial"&gt;What we have now in C++0x&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;To solve the above problem, we have to have a type which can be converted to any pointer types.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;In C++0x, this type is std::nullptr_t, and nullptr is a keyword which has value of this type.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;With nullptr, we can rewrite the code as:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;void&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; bar()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;CtorWrapperUnary&amp;lt;A&amp;gt; f;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;f(&lt;SPAN style="COLOR: blue"&gt;nullptr&lt;/SPAN&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;One difference between '0' and 'nullptr' is we can’t use the former as the non-type argument of pointer type (see &lt;B style="mso-bidi-font-weight: normal"&gt;n3090.pdf 14.4.2/5&lt;/B&gt;).&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;template&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&amp;lt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; *&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;struct&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; A {};&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;void&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; foo()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;A&amp;lt;0&amp;gt; b1; &lt;SPAN style="COLOR: green"&gt;// No conversion from 0 to ‘int *’&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;A&amp;lt;(&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; *)0&amp;gt; b2; &lt;SPAN style="COLOR: green"&gt;// OK&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;A&amp;lt;&lt;SPAN style="COLOR: blue"&gt;nullptr&lt;/SPAN&gt;&amp;gt; b3; &lt;SPAN style="COLOR: green"&gt;// OK&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;BTW, VC is not conformant here. It also allows the definition of b1.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 13pt 0in; mso-outline-level: 2" class=MsoNormal&gt;&lt;B&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; FONT-SIZE: 18pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial"&gt;Known issues / limitations&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;After the introduction of nullptr, it is reasonable to change the definition of NULL (The standard says this is implementation defined):&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;#define&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; NULL&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;nullptr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;However, many code bases incorrectly assume NULL to be an integer or '0'. For example:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;void&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; f()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;char&lt;/SPAN&gt; str[] = &lt;SPAN style="COLOR: #a31515"&gt;"a"&lt;/SPAN&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; n = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;str[0] = NULL;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;So the change will break lots of existing code &lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Wingdings; FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;L&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 13pt 0in; mso-outline-level: 2" class=MsoNormal&gt;&lt;B&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; FONT-SIZE: 18pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial"&gt;Known bugs in VC2010&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P style="TEXT-INDENT: -0.25in; MARGIN: auto 0in auto 0.5in; mso-list: l0 level1 lfo1" class=MsoListParagraph&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;1.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'"&gt;nullptr is allowed as non-type argument for function template&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;template&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&amp;lt;&lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt;&amp;gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; f();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;void&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; g()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;f&amp;lt;&lt;SPAN style="COLOR: blue"&gt;nullptr&lt;/SPAN&gt;&amp;gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="TEXT-INDENT: -0.25in; MARGIN: auto 0in auto 0.5in; mso-list: l0 level1 lfo1" class=MsoListParagraph&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;2.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'"&gt;nullptr is allowed as template template argument&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;template&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&amp;lt;&lt;SPAN style="COLOR: blue"&gt;template&lt;/SPAN&gt; &amp;lt;&lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&amp;gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt;&amp;gt; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; C {};&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;C&amp;lt;&lt;SPAN style="COLOR: blue"&gt;nullptr&lt;/SPAN&gt;&amp;gt; c;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="TEXT-INDENT: -0.25in; MARGIN: auto 0in auto 0.5in; mso-list: l0 level1 lfo1" class=MsoListParagraph&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-fareast-font-family: Calibri"&gt;&lt;SPAN style="mso-list: Ignore"&gt;&lt;FONT size=3&gt;3.&lt;/FONT&gt;&lt;SPAN style="FONT: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'"&gt;&lt;FONT size=3&gt;Some arithmetic operations on nullptr do not generate an error&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;A href="https://connect.microsoft.com/VisualStudio/feedback/details/505780" mce_href="https://connect.microsoft.com/VisualStudio/feedback/details/505780"&gt;&lt;SPAN style="mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT size=3 face=Calibri&gt;https://connect.microsoft.com/VisualStudio/feedback/details/505780&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; COLOR: blue; FONT-SIZE: 9.5pt"&gt;void&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt; test()&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;auto&lt;/SPAN&gt; x = &lt;SPAN style="COLOR: blue"&gt;nullptr&lt;/SPAN&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;x++; &lt;SPAN style="COLOR: green"&gt;// should give error&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;x += 1; &lt;SPAN style="COLOR: green"&gt;// should give error&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt; mso-layout-grid-align: none" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: Consolas; FONT-SIZE: 9.5pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="LINE-HEIGHT: normal; MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-SIZE: 12pt; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Calibri; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri"&gt;&lt;FONT face=Calibri&gt;We have special handling for nullptr when processing expressions. But apparently some cases are missing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10010051" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_/">C++</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/VC/">VC</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/Bug/">Bug</category><category domain="http://blogs.msdn.com/b/xiangfan/archive/tags/C_2B002B00_0x/">C++0x</category></item></channel></rss>