Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2021-08-07T20:17:15+02:00Les derniers messages parus sur le forum de Zeste de Savoir.overloading fonctions template, message #2364772021-08-07T20:17:15+02:00mechap/@mechaphttps://zestedesavoir.com/forums/sujet/15576/overloading-fonctions-template/?page=1#p236477<p>Mais alors pourquoi gcc n’arrive pas a appeler le premier overload dans un contexte avec template ?</p>overloading fonctions template, message #2364762021-08-07T18:19:00+02:00ads00/@ads00https://zestedesavoir.com/forums/sujet/15576/overloading-fonctions-template/?page=1#p236476<p>C’est juste un bug à cause de la lambda.</p>
<div class="hljs-code-div hljs-code-cpp"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span></div><pre><code class="hljs language-cpp"><span class="hljs-keyword">auto</span> l = []{ <span class="hljs-keyword">return</span> []{}; };
<span class="hljs-keyword">template</span> <<span class="hljs-keyword">auto</span> = <span class="hljs-built_in">l</span>()>
</code></pre></div>
<p>Le 1er overload est pas aussi pertinent, il est plus spécialisé.</p>overloading fonctions template, message #2364732021-08-07T17:17:51+02:00mechap/@mechaphttps://zestedesavoir.com/forums/sujet/15576/overloading-fonctions-template/?page=1#p236473<p>Selon <a href="http://eel.is/c++draft/over.match.best">http://eel.is/c++draft/over.match.best</a>, je pense que l’appel <code>f</code> sans specifier d’arguments (de fonctions ou de template) devrait lever une erreur de compilation pour ambiguïté, puisque le premier overload est tout aussi pertinent que le second.</p>overloading fonctions template, message #2364722021-08-07T13:02:04+02:00Berdes/@Berdeshttps://zestedesavoir.com/forums/sujet/15576/overloading-fonctions-template/?page=1#p236472<p>En testant un peu:</p>
<ul>
<li>Clang 10 et 11 donnent une erreur pour <code>func1</code> et <code>func2</code></li>
<li>Clang 12 ne donne pas d’erreur</li>
<li>gcc >=10 donnent une erreur pour <code>func1</code> uniquement</li>
</ul>
<p>En regardant les règles de <a href="https://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading">Function template overloading</a>, je ne vois rien qui indique que les règles de résolution pourraient être différente pour l’appel à <code>f</code> entre <code>func1</code> et <code>func2</code>. À partir de là, je dirais que gcc a probablement un bug.</p>overloading fonctions template, message #2364682021-08-06T16:18:24+02:00mechap/@mechaphttps://zestedesavoir.com/forums/sujet/15576/overloading-fonctions-template/?page=1#p236468<div class="custom-block custom-block-information"><div class="custom-block-body"><p>Le code ne fonctionne que sur gcc</p></div></div>
<div class="hljs-code-div hljs-code-cpp"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span></div><pre><code class="hljs language-cpp"><span class="hljs-keyword">template</span> <<span class="hljs-keyword">auto</span> = []{}>
<span class="hljs-keyword">consteval</span> <span class="hljs-keyword">auto</span> <span class="hljs-built_in">f</span>() { <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>; }
<span class="hljs-keyword">template</span> <<span class="hljs-keyword">typename</span> ...Args>
<span class="hljs-function"><span class="hljs-keyword">consteval</span> <span class="hljs-keyword">auto</span> <span class="hljs-title">f</span><span class="hljs-params">(Args &&...)</span> </span>{ <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>; }
<span class="hljs-keyword">template</span> <<span class="hljs-keyword">typename</span> T>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">func1</span><span class="hljs-params">()</span> </span>{
<span class="hljs-built_in"><span class="hljs-keyword">static_assert</span></span>(<span class="hljs-built_in">f</span>() == <span class="hljs-literal">false</span>); <span class="hljs-comment">// fails</span>
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">func2</span><span class="hljs-params">()</span> </span>{
<span class="hljs-built_in"><span class="hljs-keyword">static_assert</span></span>(<span class="hljs-built_in">f</span>() == <span class="hljs-literal">false</span>);
}
</code></pre></div>
<p>Pourquoi le premier overload de <code>f()</code> n’est jamais considere dans un contexte avec template (fonctions/structs/variables/etc templated) ? </p>