gpt4 book ai didi

c++ - 为什么编译器选项会影响模板实现的选择?

转载 作者:可可西里 更新时间:2023-11-01 15:50:37 27 4
gpt4 key购买 nike

根据我是使用 -O3 编译还是不使用优化,编译器不会选择相同的函数模板实例化。使用 gcc (Debian 8.3.0-6) 8.3.0。

由于疏忽,我在函数模板声明中有一个默认实现:

#pragma once

#include <iostream>

template <int>
void func() { std::cerr << "default impl\n"; } // normally no impl here

他们的专长:

#include "func.h"

template <>
void func<1>()
{
std::cerr << "special 1\n";
}

template <>
void func<2>()
{
std::cerr << "special 2\n";
}

还有主函数。

#include "func.h"

int main(void)
{
func<1>();
func<2>();

return 0;
}

编译并运行 g++ -Wall func.cpp main.cpp -o main && ./main 给出:

special 1
special 2

使用优化 g++ -O3 -Wall func.cpp main.cpp -o main && ./main 给出:

default impl
default impl

这是预期的吗?代码是否触发了我不知道的意外行为?

感谢@NathanOliver 发表的评论 Wandbox .使用或不使用优化进行编译会显示不同的输出。

最佳答案

您的代码格式错误,无需诊断。因此,不同优化级别的不同行为是可能的。

[temp.expl.spec]

6 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. If the program does not provide a definition for an explicit specialization and either the specialization is used in a way that would cause an implicit instantiation to take place or the member is a virtual member function, the program is ill-formed, no diagnostic required. An implicit instantiation is never generated for an explicit specialization that is declared but not defined.

函数模板专用于一个 TU,但另一个 TU 没有可用的专门化声明。积极的优化器很可能会选择隐式实例化(内联可用)而不是找到您在其他地方创建的实例。解决方案是在 header 中声明您的特化。

关于c++ - 为什么编译器选项会影响模板实现的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871390/

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