gpt4 book ai didi

c++ - 我的模板特化将调试版本与发布版本不同,这是 gcc 错误吗?

转载 作者:太空狗 更新时间:2023-10-29 20:02:30 25 4
gpt4 key购买 nike

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

$猫foo.h

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

};

template<> void foo<int>::init();

然后有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");
}

终于拿到主文件了

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

int main(){
foo<int>::init();
foo<float>::init();
}

如果我在没有优化的情况下编译并运行它,它会给出:

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

如果我添加优化,那么结果就不同了:

$ g++ foo_int.cpp foo_float.cpp main.cpp -O2 && a.out
init int foo

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

  1. Is "weak symbol"/"strong symbol" a concept of gcc/g++, or it's part of the c/c++ language specification.

  2. If debug and release results are different, should I say this is a bug/issue of gcc/g++, in regard with "weak symbol" mechanism? As a developer, I wouldn't expect my debug version to behave differently from release version.

我尝试了 clang,不幸的是同样的错误。对于调试/发布“应该”表现如此不同的 C/C++,这是“可接受的”情况吗?

最佳答案

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

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. [temp.expl.spec]/6.

foo<float>::init() 的显式特化没有声明在从 main 调用它的地方, 但在 foo_float.cpp 中有一个明确的特化, 所以程序的行为是未定义的。

关于c++ - 我的模板特化将调试版本与发布版本不同,这是 gcc 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com