使用点之后模板函数的特化会破坏编译

发布于 2024-11-06 03:52:57 字数 445 浏览 0 评论 0原文

考虑下一个示例:

#include <iostream>

template< int a >
void foo();

int main(int argn, char* argv[])
{
    foo<1>();
}

template<>
void foo<1>()
{
    std::cout<<1<<std::endl;
}

编译失败并显示下一个错误消息:

rg.cpp:12: error: specialization of ‘void foo() [with int a = 1]’ after instantiation

标准中的哪一段解释了此错误?

PS:我知道如果我将函数定义移到 main 前面将使错误消失。

Consider next example :

#include <iostream>

template< int a >
void foo();

int main(int argn, char* argv[])
{
    foo<1>();
}

template<>
void foo<1>()
{
    std::cout<<1<<std::endl;
}

The compilation fails with next error messages :

rg.cpp:12: error: specialization of ‘void foo() [with int a = 1]’ after instantiation

What paragraph in the standard explains this error?

PS :I know that if I move the function definition in front of main will make the error go away.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沒落の蓅哖 2024-11-13 03:52:57

我认为根据标准,这是未定义的行为。在 UB 的情况下,工具链可以做什么没有限制,生成编译器错误是更友好的可能性之一。


[temp.spec] 部分,14.7p5 说

对于给定的模板和给定的一组模板参数

  • 显式实例化定义在程序中最多出现一次,
  • 显式专业化最多应在程序中定义一次(根据 3.2),并且
  • 显式实例化和显式专业化声明都不应出现在
    除非显式实例化遵循显式专业化声明。

不需要实施来诊断是否违反此规则。

[temp.expl.spec] 14.7.3p6 节说:

如果模板、成员模板或类模板的成员被显式特化,则应在第一次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生这种使用的每个翻译单元中;无需诊断。


您的程序违反了这些要求。

I think that's undefined behavior according to the standard. There are no restrictions on what a toolchain can do in cases of UB, generating a compiler error is one of the friendlier possibilities.


Section [temp.spec], 14.7p5 says

For a given template and a given set of template-arguments,

  • an explicit instantiation definition shall appear at most once in a program,
  • an explicit specialization shall be defined at most once in a program (according to 3.2), and
  • both an explicit instantiation and a declaration of an explicit specialization shall not appear in a
    program unless the explicit instantiation follows a declaration of the explicit specialization.

An implementation is not required to diagnose a violation of this rule.

Section [temp.expl.spec] 14.7.3p6 says:

If a template, a member template or a member of a class template is explicitly specialized then that specialization shall be declared before the first use of that specialization that would cause an implicit instantiation to take place, in every translation unit in which such a use occurs; no diagnostic is required.


Your program violates these requirements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文