Boost C++ Libraries: Ticket #11251: boost::static_visitor<T&> causes a compilation error in C++14 mode https://svn.boost.org/trac10/ticket/11251 <p> Consider the following code: </p> <div class="wiki-code"><div class="code"><pre><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf">&quot;boost/variant.hpp&quot;</span><span class="cp"></span> <span class="k">struct</span> <span class="nl">test_vis</span> <span class="p">:</span> <span class="n">boost</span><span class="o">::</span><span class="n">static_visitor</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&amp;&gt;</span> <span class="p">{</span> <span class="kt">int</span><span class="o">&amp;</span> <span class="k">operator</span><span class="p">()(</span><span class="kt">int</span><span class="o">&amp;</span> <span class="n">i</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">i</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="n">boost</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">dummy</span><span class="p">;</span> <span class="o">++</span><span class="n">boost</span><span class="o">::</span><span class="n">apply_visitor</span><span class="p">(</span><span class="n">test_vis</span><span class="p">(),</span> <span class="n">dummy</span><span class="p">);</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">dummy</span> <span class="o">&lt;&lt;</span> <span class="sc">&#39;\n&#39;</span><span class="p">;</span> <span class="p">}</span> </pre></div></div><p> Clang 3.6.0 compiles the code with no diagnostics in C++11 mode, but in C++14 mode it issues the following error: </p> <pre class="wiki">prog.cc:12:6: error: call to 'apply_visitor' is ambiguous ++boost::apply_visitor(test_vis(), dummy); ^~~~~~~~~~~~~~~~~~~~ /boost/variant/detail/apply_visitor_unary.hpp:82:1: note: candidate function [with Visitor = test_vis, Visitable = boost::variant&lt;int&gt;] apply_visitor(const Visitor&amp; visitor, Visitable&amp; visitable) ^ /boost/variant/detail/apply_visitor_unary.hpp:160:23: note: candidate function [with Visitor = test_vis, Visitable = boost::variant&lt;int&gt;] inline decltype(auto) apply_visitor(const Visitor&amp; visitor, Visitable&amp; visitable, ^ 1 error generated. </pre><p> The same behaviour occurs in GCC 5.1.0. MSVC12 compiles the code, MSVC14 issues a similar error. </p> <p> This is due to the fact that the <code>apply_visitor</code> overloads using automatic return type detection are not disabled in this case, because the <code>boost::detail::variant::has_result_type</code> trait is not working properly for reference types. Internally, it uses an overload with a parameter type of <code>typename C::result_type*</code>, which tries to form a pointer to reference type in this case, which causes a deduction failure. </p> <p> A quick workaround is to remove the base class for the visitor in C++14 mode in this case. </p> en-us Boost C++ Libraries /htdocs/site/boost.png https://svn.boost.org/trac10/ticket/11251 Trac 1.4.3 James Benze <benzejaa@…> Fri, 08 May 2015 20:17:32 GMT <link>https://svn.boost.org/trac10/ticket/11251#comment:1 </link> <guid isPermaLink="false">https://svn.boost.org/trac10/ticket/11251#comment:1</guid> <description> <p> I can duplicate this error with GCC 5.1.0 </p> <p> Thanks for the quick workaround. Much appreciated. </p> </description> <category>Ticket</category> </item> <item> <dc:creator>Antony Polukhin</dc:creator> <pubDate>Mon, 22 Jun 2015 19:24:59 GMT</pubDate> <title>owner, status, milestone changed https://svn.boost.org/trac10/ticket/11251#comment:2 https://svn.boost.org/trac10/ticket/11251#comment:2 <ul> <li><strong>owner</strong> changed from <span class="trac-author">ebf</span> to <span class="trac-author">Antony Polukhin</span> </li> <li><strong>status</strong> <span class="trac-field-old">new</span> → <span class="trac-field-new">assigned</span> </li> <li><strong>milestone</strong> <span class="trac-field-old">To Be Determined</span> → <span class="trac-field-new">Boost 1.59.0</span> </li> </ul> <p> Thanks for the report and hints! </p> <p> This issue has been fixed in <a class="ext-link" href="https://github.com/boostorg/variant/commit/aad58b5fe5b2605bf752c8151ae0539df98223f9"><span class="icon">​</span>develop branch</a>. As a workaround you can remove the <code>boost::static_visitor&lt;int&amp;&gt;</code> or just <a class="ext-link" href="https://github.com/boostorg/variant/commit/aad58b5fe5b2605bf752c8151ae0539df98223f9"><span class="icon">​</span>patch the</a> `boost/variant/detail/has_result_type.hpp ` file. </p> Ticket Antony Polukhin Tue, 28 Jul 2015 20:20:01 GMT status changed; resolution set https://svn.boost.org/trac10/ticket/11251#comment:3 https://svn.boost.org/trac10/ticket/11251#comment:3 <ul> <li><strong>status</strong> <span class="trac-field-old">assigned</span> → <span class="trac-field-new">closed</span> </li> <li><strong>resolution</strong> → <span class="trac-field-new">fixed</span> </li> </ul> Ticket