我的模板专业化调试版本与发行版本不同,这是gcc错误吗?

Tro*_*yvs 3 c++ templates symbols weak specialization

首先,我有一个类的头文件,一个没有定义的专业声明(来自互联网的代码示例)

$ cat foo.h

template<typename T>
class foo{
public:
  static void init(){
      return;
  }

};

template<>  void foo<int>::init();
Run Code Online (Sandbox Code Playgroud)

然后有2个用于模板专业化的实现文件

$ cat foo_int.cpp 
#include "foo.h"
#include<stdio.h>
template<>
void foo<int>::init(){
    printf("init int foo\n");
}

$ cat foo_float.cpp 
#include "foo.h"
#include<stdio.h>
template<>
void foo<float>::init(){
    printf("init float foo\n");
}
Run Code Online (Sandbox Code Playgroud)

终于我有了一个主文件

$ cat main.cpp
#include "foo.h"

int main(){
  foo<int>::init();
  foo<float>::init();
}
Run Code Online (Sandbox Code Playgroud)

如果我不进行优化就编译并运行它,它将得到:

g ++ foo_int.cpp foo_float.cpp main.cpp && a.out
init int foo
init浮点foo

如果添加优化,则结果将不同:

$ g ++ foo_int.cpp foo_float.cpp main.cpp -O2 && a.out
初始化int foo

结果是不同的。互联网上的一些解释说,这是由于gcc实施中的某些“弱符号”内部机制引起的,但我的问题是:

  1. gcc / g ++是“弱符号” /“强符号”的概念,还是c / c ++语言规范的一部分。

  2. 如果调试和发布结果不同,就“弱符号”机制而言,我是否应该说这是gcc / g ++的错误/问题?作为开发人员,我不希望调试版本的行为与发行版本有所不同。

我试过c,不幸的是同样的错误。这是C / C ++的“可接受的”情况,调试/发布的“应该”行为如此不同吗?

Pet*_*ker 5

语言定义要求您在使用它之前声明一个明确的专业化:

如果一个模板,一个成员模板或一个类模板的成员被明确地专门化,则应在首次使用该专门化之前声明该专门化,这将在发生这种使用的每个翻译单元中引起隐式实例化; 无需诊断。[temp.expl.spec] / 6。

foo<float>::init()从中调用时main,没有声明的显式专门化,但是在中有显式的专门化foo_float.cpp,因此程序的行为是不确定的。