{"id":7321,"date":"2015-12-02T17:00:00","date_gmt":"2015-12-02T17:00:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2015\/12\/02\/partial-support-for-expression-sfinae-in-vs-2015-update-1\/"},"modified":"2019-04-18T09:31:07","modified_gmt":"2019-04-18T09:31:07","slug":"partial-support-for-expression-sfinae-in-vs-2015-update-1","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/partial-support-for-expression-sfinae-in-vs-2015-update-1\/","title":{"rendered":"Partial Support for Expression SFINAE in VS 2015 Update 1"},"content":{"rendered":"<p>In Visual Studio 2015 Update 1, we added partial support for C++11 core language feature Expression SFINAE.<\/p>\n<h2>What is SFINAE?<\/h2>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Substitution_failure_is_not_an_error\">SFINAE<\/a> is an acronym for &lsquo;Substitution Failure Is Not An Error&rsquo;. The idea is that when the compiler tries to specialize a function template during overload resolution, it is ok if the specialization fails as long as there are other valid candidates. C++11 introduced features like decltype and constexpr, and it is more common to have expressions during the template argument deduction and substitution process. The C++ standards committee clarified the SFINAE rules for expressions in C++11.<\/p>\n<h2>Why partial implementation of Expression SFINAE?<\/h2>\n<p>It&#8217;s&nbsp;partial for a couple of reasons:<\/p>\n<ol>\n<li>We are progressively improving the parser for the Visual C++ compiler with an eye towards complete conformance for the Expressions SFINAE feature. For some insights into this work, see <a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2015\/09\/25\/rejuvenating-the-microsoft-c-c-compiler.aspx\">Rejuvenating the Microsoft C\/C++ Compiler<\/a> by Jim Springfield.<\/li>\n<li>In Visual Studio 2015 RTM, we don&rsquo;t implement SFINAE rules for expressions and have limited support for Expression SFINAE. Improvements to Expression SFINAE will start with Visual Studio 2015 Update 1 and will incrementally become conformant to the C++11 Standard.<\/li>\n<\/ol>\n<h2>What did we do?<\/h2>\n<p>We are still using our old token stream-based approach and are not yet using a Recursive Descent Parse tree, so there are still some <a href=\"#unsupported\">unsupported scenarios<\/a>. For this release, we fixed the following issues:<\/p>\n<p style=\"padding-left: 30px\"><a href=\"https:\/\/devblogs.microsoft.com\/00\/00\/00\/65\/69\/3513.E.SFINAE%20Fixed%20bugs.png\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/00\/00\/00\/65\/69\/3513.E.SFINAE%20Fixed%20bugs.png\" alt=\"\" width=\"600\" \/><\/a><\/p>\n<p>Thanks to everyone who provided feedback!<\/p>\n<h2>Supported Scenarios in Update 1<\/h2>\n<p>There are four supported scenarios.<\/p>\n<p><strong>Using dependent expression in default argument of template type parameter of function template or type of function parameter:<\/strong><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><a><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray;background: white\">#include<\/span><\/a><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&lt;type_traits&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">class<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">A<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">public<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">:<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">explicit<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> A(<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&amp;);<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">U<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">V<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> = std::<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">enable_if_t<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">!std::<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">is_same<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">U<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">, <\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">T<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;::value<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; &gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">explicit<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> A(<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">U<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&amp;);<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">class<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">B<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">public<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">:<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">enum<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { M = 1 };<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> I&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> foo(std::<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">enable_if_t<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(I == M)<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;* = <\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">nullptr<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> I&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> foo(std::<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">enable_if_t<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(I != M)<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;* = <\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">nullptr<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> I&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> g() { foo&lt;I + 1&gt;(); }<span>&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ VS2015 RTM gives error C2668: &#8216;B&lt;int&gt;::foo&#8217;: ambiguous call to overloaded function<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f(<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">B<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray;background: white\">b<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">)<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray;background: white\">b<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">.g&lt;0&gt;();<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">A<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><\/span><span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;(0);<\/span><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\">}<\/p>\n<p><strong>Using dependent decltype in the default argument of a template type parameter of a class template:<\/strong><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray;background: white\">#include<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&lt;type_traits&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">class<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">C<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(&amp;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">C<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">::m)&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">M<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">fail_type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">M<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> test(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> *);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">fail_type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> test(&#8230;);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> m; };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(!std::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">is_same<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(test&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">nullptr<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">)), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">fail_type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;fail&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">); <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ fail in VS2015 RTM<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(std::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">is_same<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(test&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">nullptr<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">)), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">fail_type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;fail&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><span>&nbsp;<\/span><\/p>\n<p><strong>Using dependent decltype in the type of a template non-type argument:<\/strong><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray;background: white\">#include<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&lt;type_traits&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">using<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> namespace<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> std;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> enable_if<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">is_void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;().f()<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">)&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> V = 0&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">char<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">); <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ VS2015 RTM can&#8217;t compile this declaration<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">short<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f(&#8230;);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f(); };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f(); };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> S3<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">sizeof<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(f(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{})) == <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">sizeof<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">char<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;fail&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">sizeof<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(f(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{})) == <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">sizeof<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">short<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;fail&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">sizeof<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(f(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S3<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{})) == <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">sizeof<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">short<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;fail&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p><strong>Using dependent decltype in the template argument of a partial specialization of a class template:<\/strong><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: gray;background: white\">#include<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&lt;type_traits&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">class<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">class <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">V<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">is_complete<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> : std::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">false_type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">class<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> is_complete<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">sizeof<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">)))<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; : std::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">true_type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">is_complete<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;fail&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">); <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ fail in VS2015 RTM<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin: 0in 0in 0.0001pt 0.25in;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(!<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">is_complete<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;fail&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<h2><a name=\"unsupported\"><\/a>Unsupported Scenarios in Update 1<\/h2>\n<p>There are currently 6 unsupported scenarios. Some have workarounds.<\/p>\n<p><strong>Declaring two functions with the same signature except for different expressions in the decltype.<\/strong> You will encounter this issue if you try to build the Boost library. Because we capture expressions as a token stream, we are not able to reliably compare different expressions (for example, one problem is that we don&rsquo;t know what &lsquo;T&rsquo; or &lsquo;I&rsquo; means). All dependent decltypes are currently considered as the same type.<\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> I&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">auto<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> foo(I i) -&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(i.a)<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {}<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> I&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">auto<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> foo(I i) -&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(i.b)<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {} <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green\">\/\/ function template has already been defined<\/span><\/p>\n<p><strong>Using different decltypes as the template argument of the specializations of the same template.<\/strong> Similar to the issue above, you will encounter this issue if you try to build the Boost library because we are not able to distinguish between different decltypes and treat the specializations as the same. One possible workaround is to add an additional unique template argument.<\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> declval(); <\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><br \/><\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&#8230; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">void_<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">; };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\">&nbsp;<\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {};<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">void_<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;()())<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;()()) <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">}<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: teal;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T0<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T0<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> void_<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;()(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">T0<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;()))<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;()(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T0<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;())) <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">}<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: teal;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: teal;background: white\">operator()<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">() <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\">&nbsp;<\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: teal;background: white\">operator()<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">) <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f()<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ In VS2015 RTM, both fail to compile.<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ In VS2015 Update 1, the second still fails to compile.<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ This is because &#8216;void_&lt;decltype(declval&lt;R&gt;()(declval&lt;T0&gt;()))&#8217;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ is considered the same as &#8216;void_&lt;decltype(declval&lt;R&gt;()())&gt;&#8217;, and the second partial<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ specialization uses the latter to specialize and fail.<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> S1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">()&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">)&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: .0001pt;text-indent: .5in;line-height: normal\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">}<\/span><\/p>\n<p><strong>Using dependent constexpr function for SFINAE.<\/strong> Our current infrastructure always parses constexpr immediately whether it is dependent or not. You will encounter this issue if you try to build the range-v3 library.<\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\">&nbsp;<span style=\"font-size: 9.5pt;font-family: Consolas;color: gray;background: white\">#include<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&lt;type_traits&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">bool<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> constexpr<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> concept_fn()<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">return<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> std::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">is_same<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">}<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f(std::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">enable_if_t<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">concept_fn&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;()<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;* = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">nullptr<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f(std::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">enable_if_t<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">!concept_fn&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;()<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;* = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">nullptr<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<p><strong>Using pack expansion inside decltype.<\/strong> This will be fixed in VS2015 Update 2.<\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> declval();<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> T<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">void_<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">; };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&#8230; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Args<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Args<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&#8230;), <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">void_<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;()(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">Args<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">&gt;()&#8230;))<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">R<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;()(declval&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Args<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;()&#8230;)) <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: teal;background: white\">operator()<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">) <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> f()<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">{<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ fail in VS2015 Update 1<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">trait<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">const<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">S<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">)&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">}<\/span><\/p>\n<p><strong>Dereferencing pointer-to-data-member inside decltype.<\/strong> This will be fixed in VS2015 Update 2.<\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">AlwaysVoid<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typedef<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> Pmd<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Obj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">void<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> IsCallableObj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> {<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">constexpr <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">bool<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> value = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">false<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">template<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> &lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> Pmd<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> Obj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">IsCallableObj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Pmd<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Obj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">,<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">typename<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> AlwaysVoid<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow\">decltype<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">Obj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">{}.*<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow\">Pmd<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: yellow\">{})<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">type<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt; {<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> constexpr<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\"> bool<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> value = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">true<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">};<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> X<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">using<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> PMD<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> = <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">int<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> X<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">::*;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">class<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\"> Inaccessible<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> : <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">private<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">X<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Derived1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> : <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">X<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Derived2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> : <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">X<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">struct <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Ambiguous<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> : <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Derived1<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Derived2<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\"> { };<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">IsCallableObj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">PMD<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">X<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;BOOM: Inaccessible&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: green;background: white\">\/\/ The following two static_asserts fail in VS2015 Update 1<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(!<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">IsCallableObj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">PMD<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Inaccessible<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;BOOM: Inaccessible&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<p class=\"MsoNormal\" style=\"margin-bottom: 0.0001pt;line-height: normal;vertical-align: middle;padding-left: 30px\"><span style=\"font-size: 9.5pt;font-family: Consolas;color: blue;background: white\">static_assert<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">(!<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">IsCallableObj<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&lt;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">PMD<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white\">Ambiguous<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">&gt;::value, <\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: #a31515;background: white\">&#8220;BOOM: Ambiguous&#8221;<\/span><span style=\"font-size: 9.5pt;font-family: Consolas;color: black;background: white\">);<\/span><\/p>\n<p><strong>Using non-dependent decltype in the template argument of a partial specialization of a class template.<\/strong> Our compiler currently can&rsquo;t tell whether an expression (which is captured as a token stream) is dependent or not, so it uses heuristic which fails to identify the expression used in the bug as non-dependent. For more details, see this <a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/1660945\/vs-2015-rejects-chromium-template-code-which-vs-2013-gcc-and-clang-all-acceptfor details\">issue<\/a> on Connect.<\/p>\n<h2>Plan moving forward<\/h2>\n<p>Most of the limitations are related to our token stream-based approach, so we are moving to a new Recursive Descent Parser-based parse tree to capture expressions. This will let us represent expressions more accurately and help us support more scenarios including Expression SFINAE usage in the Boost libraries.<\/p>\n<p>We will also implement the remaining semantic requirements for Expression SFINAE including identifying whether an expression is dependent or not, enabling the comparison of dependent expression and enabling the substitution of dependent expressions.<\/p>\n<p>The Visual C++ team appreciates your comments and feedback. Thank you!<\/p>\n<p>Xiang Fan<br \/>Visual C++ Team<\/p>\n<p class=\"MsoNormal\" style=\"margin-top: 0in;margin-right: 0in;margin-bottom: .0001pt;margin-left: 9.0pt;line-height: normal\"><span>&nbsp;<\/span><\/p>\n<p><!--[if gte mso 9]&gt;--><\/p>\n<p>  Normal\n  0<\/p>\n<p>  false\n  false\n  false<\/p>\n<p>  EN-US\n  ZH-CN\n  X-NONE<\/p>\n<p><!--[if gte mso 9]&gt;--><\/p>\n<p><!--[if gte mso 10]&gt;--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Visual Studio 2015 Update 1, we added partial support for C++11 core language feature Expression SFINAE. What is SFINAE? SFINAE is an acronym for &lsquo;Substitution Failure Is Not An Error&rsquo;. The idea is that when the compiler tries to specialize a function template during overload resolution, it is ok if the specialization fails as [&hellip;]<\/p>\n","protected":false},"author":1062,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[137,116,247,248],"class_list":["post-7321","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus","tag-announcements","tag-c11","tag-decltype","tag-expression-sfinae"],"acf":[],"blog_post_summary":"<p>In Visual Studio 2015 Update 1, we added partial support for C++11 core language feature Expression SFINAE. What is SFINAE? SFINAE is an acronym for &lsquo;Substitution Failure Is Not An Error&rsquo;. The idea is that when the compiler tries to specialize a function template during overload resolution, it is ok if the specialization fails as [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/7321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/1062"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=7321"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/7321\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=7321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=7321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=7321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}