{"id":4473,"date":"2009-05-25T11:49:00","date_gmt":"2009-05-25T11:49:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2009\/05\/25\/stl-breaking-changes-in-visual-studio-2010-beta-1\/"},"modified":"2019-02-18T18:45:55","modified_gmt":"2019-02-18T18:45:55","slug":"stl-breaking-changes-in-visual-studio-2010-beta-1","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/stl-breaking-changes-in-visual-studio-2010-beta-1\/","title":{"rendered":"STL Breaking Changes in Visual Studio 2010 Beta 1"},"content":{"rendered":"<p class=\"MsoNormal\"><span><a href=\"http:\/\/www.microsoft.com\/visualstudio\/en-us\/products\/2010\/default.mspx\"><font color=\"#0000ff\">Visual Studio 2010 Beta 1<\/font><\/a> is now available for download.&nbsp; I&#8217;ve recently blogged about how Visual C++ in VS 2010 Beta 1, which I refer to as VC10 Beta 1, contains compiler support for five C++0x core language features: <a href=\"http:\/\/blogs.msdn.com\/vcblog\/archive\/2008\/10\/28\/lambdas-auto-and-static-assert-c-0x-features-in-vc10-part-1.aspx\"><font color=\"#0000ff\">lambdas, auto, static_assert<\/font><\/a>, <a href=\"http:\/\/blogs.msdn.com\/vcblog\/archive\/2009\/02\/03\/rvalue-references-c-0x-features-in-vc10-part-2.aspx\"><font color=\"#0000ff\">rvalue references<\/font><\/a>, and <a href=\"http:\/\/blogs.msdn.com\/vcblog\/archive\/2009\/04\/22\/decltype-c-0x-features-in-vc10-part-3.aspx\">decltype<\/a>.&nbsp; It also contains a substantially rewritten implementation of the C++ Standard Library, supporting many C++0x standard library features.&nbsp; In the near future, I&#8217;ll blog about them in Part 4 and beyond of &#8220;C++0x Features in VC10&#8221;, but today I&#8217;m going to talk about the STL changes that have the potential to break existing code, which you&#8217;ll probably want to know about before playing with the C++0x goodies.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Problem 1: error C3861: &#8216;back_inserter&#8217;: identifier not found<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>This program compiles and runs cleanly with VC9 SP1:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;type back_inserter.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;algorithm&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;iostream&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;ostream&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;vector&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>using namespace std;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>int square(const int n) {<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; return n * n;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>int main() {<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; vector&lt;int&gt; v;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; v.push_back(11);<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; v.push_back(22);<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; v.push_back(33);<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; vector&lt;int&gt; dest;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; transform(v.begin(), v.end(), back_inserter(dest), square);<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; for (vector&lt;int&gt;::const_iterator i = dest.begin(); i != dest.end(); ++i) {<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; *i &lt;&lt; endl;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; }<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;cl \/EHsc \/nologo \/W4 back_inserter.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>back_inserter.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;back_inserter<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>121<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>484<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>1089<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>But it fails to compile with VC10 Beta 1:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;cl \/EHsc \/nologo \/W4 back_inserter.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>back_inserter.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>back_inserter.cpp(19) : error C3861: &#8216;back_inserter&#8217;: identifier not found<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>What&#8217;s wrong?<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Solution: #include &lt;iterator&gt;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>The problem was that <\/span><span>back_inserter()<\/span><span> was used without including &lt;iterator&gt;.&nbsp; The C++ Standard Library headers include one another in unspecified ways.&nbsp; &#8220;Unspecified&#8221; means that the Standard allows but doesn&#8217;t require any header X to include any header Y.&nbsp; Furthermore, implementations (like Visual C++) aren&#8217;t required to document what they do, and are allowed to change what they do from version to version (or according to the phase of the moon, or anything else).&nbsp; That&#8217;s what happened here.&nbsp; In VC9 SP1, including &lt;algorithm&gt; dragged in &lt;iterator&gt;.&nbsp; In VC10 Beta 1, &lt;algorithm&gt; doesn&#8217;t drag in &lt;iterator&gt;.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>When you use a C++ Standard Library component, you should be careful to include its header (i.e. the header that the Standard says it&#8217;s supposed to live in).&nbsp; This makes your code portable and immune to implementation changes like this one.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>There are probably more places where headers have stopped dragging in other headers, but &lt;iterator&gt; is overwhelmingly the most popular header that people have forgotten to include.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Note: Range Insertion and Range Construction<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>By the way, when <\/span><span>seq<\/span><span> is a <\/span><span>vector<\/span><span>, <\/span><span>deque<\/span><span>, or <\/span><span>list<\/span><span>, instead of writing this:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>copy(first, last, back_inserter(seq)); \/\/ Bad!<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>You should write this:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>seq.insert(seq.end(), first, last); \/\/ Range Insertion &#8211; Good!<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>Or, if you&#8217;re constructing <\/span><span>seq<\/span><span>, simply write this:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>vector&lt;T&gt; seq(first, last); \/\/ Range Construction &#8211; Good!<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>They&#8217;re not only slightly less typing, they&#8217;re also significantly more efficient.&nbsp; <\/span><span>copy()<\/span><span>-to-<\/span><span>back_inserter()<\/span><span> calls <\/span><span>push_back()<\/span><span> repeatedly, which can trigger multiple <\/span><span>vector<\/span><span> reallocations.&nbsp; Given forward or better iterators, range insertion and range construction can just count how many elements you&#8217;ve got, and allocate enough space for all of them all at once.&nbsp; This is also more efficient for <\/span><span>deque<\/span><span>, and you may as well do it for <\/span><span>list<\/span><span> too.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Problem 2: error C2664: &#8216;std::vector&lt;_Ty&gt;::_Inside&#8217; : cannot convert parameter 1 from &#8216;IUnknown **&#8217; to &#8216;const ATL::CComPtr&lt;T&gt; *&#8217;<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>This program compiles and runs cleanly with VC9 SP1:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;type vector_ccomptr.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;atlcomcli.h&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;stddef.h&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;iostream&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;ostream&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>#include &lt;vector&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>using namespace std;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>int main() {<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; vector&lt;CComPtr&lt;IUnknown&gt;&gt; v;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp; v.push_back(NULL);<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>}<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;cl \/EHsc \/nologo \/W4 vector_ccomptr.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>vector_ccomptr.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;vector_ccomptr<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>But it fails to compile with VC10 Beta 1:<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Temp&gt;cl \/EHsc \/nologo \/W4 vector_ccomptr.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>vector_ccomptr.cpp<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Program FilesMicrosoft Visual Studio 10.0VCINCLUDEvector(623) : error C2664: &#8216;std::vector&lt;_Ty&gt;::_Inside&#8217; : cannot convert parameter 1 from &#8216;IUnknown **&#8217; to &#8216;const ATL::CComPtr&lt;T&gt; *&#8217;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Ty=ATL::CComPtr&lt;IUnknown&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T=IUnknown<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C:Program FilesMicrosoft Visual Studio 10.0VCINCLUDEvector(622) : while compiling class template member function &#8216;void std::vector&lt;_Ty&gt;::push_back(_Ty &amp;&amp;)&#8217;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;_Ty=ATL::CComPtr&lt;IUnknown&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vector_ccomptr.cpp(9) : see reference to class template instantiation &#8216;std::vector&lt;_Ty&gt;&#8217; being compiled<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Ty=ATL::CComPtr&lt;IUnknown&gt;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>C:Program FilesMicrosoft Visual Studio 10.0VCINCLUDEvector(625) : error C2040: &#8216;-&#8216; : &#8216;IUnknown **&#8217; differs in levels of indirection from &#8216;ATL::CComPtr&lt;T&gt; *&#8217;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T=IUnknown<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>What&#8217;s wrong?<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><b><span>Solution: Use CAdapt<\/p>\n<p><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>The Standard containers prohibit their elements from overloading the address-of operator.&nbsp; <\/span><span>CComPtr<\/span><span> overloads the address-of operator.&nbsp; Therefore, <\/span><span>vector&lt;CComPtr&lt;T&gt;&gt;<\/span><span> is forbidden (it triggers undefined behavior).&nbsp; It happened to work in VC9 SP1, but it doesn&#8217;t in VC10 Beta 1.&nbsp; That&#8217;s because <\/span><span>vector<\/span><span> now uses the address-of operator in <\/span><span>push_back()<\/span><span>, among other places.<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span>The solution is to use &lt;atlcomcli.h&gt;&#8217;s <\/span><span>CAdapt<\/span><span>, whose only purpose in life is to wrap address-of-overloading types for consumption by Standard containers.&nbsp; <\/span><span>vector&lt;CAdapt&lt;CComPtr&lt;T&gt;&gt;&gt;<\/span><span> will compile just fine.&nbsp; In VC10 Beta 1, I added <\/span><span>operator-&gt;()<\/span><span> to <\/span><span>CAdapt<\/span><span>, allowing <\/span><span>v[i]-&gt;Something()<\/span><span> to compile unchanged.&nbsp; However, typically you&#8217;ll have to make a few other changes when adding <\/span><span>CAdapt<\/span><span> to your program.&nbsp; <\/span><span>operator.()<\/span><span> can&#8217;t be overloaded, so if you&#8217;re calling <\/span><span>CComPtr<\/span><span>&#8216;s member functions like <\/span><span>Release()<\/span><span>, you&#8217;ll need to go through <\/span><span>CAdapt<\/span><span>&#8216;s public data member <\/span><span>m_T<\/span><span> .&nbsp; For example, <\/span><span>v[i].Release()<\/span><span> needs to be transformed into <\/span><span>v[i].m_T.Release()<\/span><span> .&nbsp; Also, if you&#8217;re relying on implicit conversions, <\/span><span>CAdapt<\/span><span> adds an extra layer, which will interfere with them.&nbsp; Therefore, you may need to explicitly convert things when pushing them back into the <\/span><span>vector<\/span><span><\/span><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Visual Studio 2010 Beta 1 is now available for download.&nbsp; I&#8217;ve recently blogged about how Visual C++ in VS 2010 Beta 1, which I refer to as VC10 Beta 1, contains compiler support for five C++0x core language features: lambdas, auto, static_assert, rvalue references, and decltype.&nbsp; It also contains a substantially rewritten implementation of the [&hellip;]<\/p>\n","protected":false},"author":289,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4473","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>Visual Studio 2010 Beta 1 is now available for download.&nbsp; I&#8217;ve recently blogged about how Visual C++ in VS 2010 Beta 1, which I refer to as VC10 Beta 1, contains compiler support for five C++0x core language features: lambdas, auto, static_assert, rvalue references, and decltype.&nbsp; It also contains a substantially rewritten implementation of the [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/289"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=4473"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4473\/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=4473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=4473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=4473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}