Specialization of template function after point of use will break the compilation

时间秒杀一切 提交于 2019-12-01 18:06:04

问题


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.


回答1:


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.



来源:https://stackoverflow.com/questions/5912689/specialization-of-template-function-after-point-of-use-will-break-the-compilatio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!