【问题标题】:Specialization of template function after point of use will break the compilation使用点后模板函数的特化会破坏编译
【发布时间】:2011-05-06 14:14:31
【问题描述】:

考虑下一个例子:

#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 前面会使错误消失。

【问题讨论】:

    标签: c++ specialization language-lawyer template-function


    【解决方案1】:

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


    [temp.spec] 部分,14.7p5 说

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

    • 显式实例化定义在程序中最多出现一次,
    • 在程序中最多可以定义一次显式特化(根据 3.2),并且
    • 显式实例化和显式特化声明均不得出现在 除非显式实例化遵循显式特化声明。

    诊断违反此规则的行为不需要实现。

    [temp.expl.spec]14.7.3p6 部分说:

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多