当同时存在模板和非模板重载时,“foo.template bar()”应该做什么?

2024-01-03

一位同事与我分享了这段代码:

run on gcc.godbolt.org https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:c%2B%2B,selection:(endColumn:19,endLineNumber:14,positionColumn:19,positionLineNumber:14,selectionStartColumn:19,selectionStartLineNumber:14,startColumn:19,startLineNumber:14),source:%27%23include+%3Ciostream%3E%0A%0Astruct+A%0A%7B%0A++++void+foo()+%7Bstd::cout+%3C%3C+%221%5Cn%22%3B%7D%0A%0A++++template+%3Ctypename+T+%3D+int%3E%0A++++void+foo()+%7Bstd::cout+%3C%3C+%222%5Cn%22%3B%7D%0A%7D%3B%0A%0Aint+main()%0A%7B%0A++++A+x%3B%0A++++x.template+foo()%3B%0A%7D%27),l:%275%27,n:%270%27,o:%27C%2B%2B+source+%231%27,t:%270%27)),k:43.28981723237598,l:%274%27,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((g:!((h:compiler,i:(compiler:clang1300,filters:(b:%270%27,binary:%271%27,commentOnly:%270%27,demangle:%270%27,directives:%270%27,execute:%270%27,intel:%270%27,libraryCode:%270%27,trim:%271%27),flagsViewOpen:%271%27,fontScale:14,fontUsePx:%270%27,j:2,lang:c%2B%2B,libs:!(),options:%27-std%3Dc%2B%2B20+-Wall+-Wextra+-pedantic-errors%27,selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1,tree:%271%27),l:%275%27,n:%270%27,o:%27x86-64+clang+13.0.0+(C%2B%2B,+Editor+%231,+Compiler+%232)%27,t:%270%27)),header:(),k:29.623619985624018,l:%274%27,m:49.21700223713646,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((h:output,i:(compiler:2,editor:1,fontScale:14,fontUsePx:%270%27,tree:%271%27,wrap:%271%27),l:%275%27,n:%270%27,o:%27Output+of+x86-64+clang+13.0.0+(Compiler+%232)%27,t:%270%27)),header:(),l:%274%27,m:50.78299776286354,n:%270%27,o:%27%27,s:0,t:%270%27)),k:56.71018276762404,l:%273%27,n:%270%27,o:%27%27,t:%270%27)),l:%272%27,n:%270%27,o:%27%27,t:%270%27)),version:4

#include <iostream>

struct A
{
    void foo() {std::cout << "1\n";}
    
    template <typename T = int>
    void foo() {std::cout << "2\n";}
};

int main()
{
    A x;
    x.template foo();
}

海湾合作委员会印刷品1, 叮当打印2,并且 MSVC 抱怨缺少模板参数。

哪个编译器是正确的?


[临时名称]/5 https://timsong-cpp.github.io/cppwp/n4868/temp.names#5表示一个名称前缀为template必须是一个模板 ID,这意味着它必须有一个模板参数列表。 (或者它可以引用没有模板参数列表的类/别名模板,但是这个当前草案中已弃用 https://eel.is/c++draft/depr.template.template后果P1787R6 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1787r6.html作者:@DavisHerring。)

甚至还有一个与您的示例几乎相同的示例,表明您使用template格式不正确。

需求和例子来自CWG 缺陷报告 96 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#96,其中考虑了没有要求的可能的歧义。

打开 GCC 错误报告是here https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55588。我无法找到 Clang 错误报告,但搜索它并不那么容易。它是缺陷报告的实施状态页面 https://clang.llvm.org/cxx_dr_status.html但是确实将缺陷报告列为未实施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当同时存在模板和非模板重载时,“foo.template bar()”应该做什么? 的相关文章

随机推荐