<bdo id='M0iD7'></bdo><ul id='M0iD7'></ul>

        <tfoot id='M0iD7'></tfoot>

        <legend id='M0iD7'><style id='M0iD7'><dir id='M0iD7'><q id='M0iD7'></q></dir></style></legend>
        <i id='M0iD7'><tr id='M0iD7'><dt id='M0iD7'><q id='M0iD7'><span id='M0iD7'><b id='M0iD7'><form id='M0iD7'><ins id='M0iD7'></ins><ul id='M0iD7'></ul><sub id='M0iD7'></sub></form><legend id='M0iD7'></legend><bdo id='M0iD7'><pre id='M0iD7'><center id='M0iD7'></center></pre></bdo></b><th id='M0iD7'></th></span></q></dt></tr></i><div id='M0iD7'><tfoot id='M0iD7'></tfoot><dl id='M0iD7'><fieldset id='M0iD7'></fieldset></dl></div>
      1. <small id='M0iD7'></small><noframes id='M0iD7'>

      2. 为什么具有“相同签名"的模板和非模板函数

        时间:2023-05-24
      3. <small id='ISYz9'></small><noframes id='ISYz9'>

        • <bdo id='ISYz9'></bdo><ul id='ISYz9'></ul>

            1. <legend id='ISYz9'><style id='ISYz9'><dir id='ISYz9'><q id='ISYz9'></q></dir></style></legend><tfoot id='ISYz9'></tfoot>
            2. <i id='ISYz9'><tr id='ISYz9'><dt id='ISYz9'><q id='ISYz9'><span id='ISYz9'><b id='ISYz9'><form id='ISYz9'><ins id='ISYz9'></ins><ul id='ISYz9'></ul><sub id='ISYz9'></sub></form><legend id='ISYz9'></legend><bdo id='ISYz9'><pre id='ISYz9'><center id='ISYz9'></center></pre></bdo></b><th id='ISYz9'></th></span></q></dt></tr></i><div id='ISYz9'><tfoot id='ISYz9'></tfoot><dl id='ISYz9'><fieldset id='ISYz9'></fieldset></dl></div>

                  <tbody id='ISYz9'></tbody>

                  本文介绍了为什么具有“相同签名"的模板和非模板函数的重载?调用非模板函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  限时送ChatGPT账号..

                  我有这个代码:

                  template<
                      class T = const int &
                  > void f(T) {}
                  
                  void f(const int &) {}
                  
                  int main() {
                     f(0);
                  }
                  

                  为什么它调用第二个而不是第一个?我会认为它们是相同的,但它们显然不是,因为我没有收到重新定义错误.

                  Why does it call the second one instead of first? I would think of them as being the same but they're clearly not as I do not get a redefinition error.

                  推荐答案

                  因为第二个重载不是模板.

                  Because the second overload is not a template.

                  当模板函数和非模板函数都可用于解析函数调用时,选择非模板函数.

                  When a template function and a non-template function are both viable for resolving a function call, the non-template function is selected.

                  来自 C++ 11 标准的第 13.3.3/1 段:

                  From Paragraph 13.3.3/1 of the C++ 11 Standard:

                  [...] 鉴于这些定义,如果对于所有参数 i,ICSi(F1) 不是更差的转换,则可行函数 F1 被定义为比另一个可行函数 F2 更好的函数序列比ICSi(F2),然后[...] F1是一个非模板函数,F2是一个函数模板特化 [...]

                  [...] Given these definitions, a viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi(F1) is not a worse conversion sequence than ICSi(F2), and then [...] F1 is a non-template function and F2 is a function template specialization [...]

                  这篇关于为什么具有“相同签名"的模板和非模板函数的重载?调用非模板函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:来自元组的构造函数参数 下一篇:我可以将 C++17 无捕获 lambda constexpr 转换运算符的

                  相关文章

                  最新文章

                  1. <tfoot id='j0Cf7'></tfoot>
                        <bdo id='j0Cf7'></bdo><ul id='j0Cf7'></ul>
                      <i id='j0Cf7'><tr id='j0Cf7'><dt id='j0Cf7'><q id='j0Cf7'><span id='j0Cf7'><b id='j0Cf7'><form id='j0Cf7'><ins id='j0Cf7'></ins><ul id='j0Cf7'></ul><sub id='j0Cf7'></sub></form><legend id='j0Cf7'></legend><bdo id='j0Cf7'><pre id='j0Cf7'><center id='j0Cf7'></center></pre></bdo></b><th id='j0Cf7'></th></span></q></dt></tr></i><div id='j0Cf7'><tfoot id='j0Cf7'></tfoot><dl id='j0Cf7'><fieldset id='j0Cf7'></fieldset></dl></div>

                    1. <small id='j0Cf7'></small><noframes id='j0Cf7'>

                      <legend id='j0Cf7'><style id='j0Cf7'><dir id='j0Cf7'><q id='j0Cf7'></q></dir></style></legend>