gpt4 book ai didi

c++ - gcc 何时编译未使用的模板代码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:06:40 24 4
gpt4 key购买 nike

我有以下(诚然人为设计的)代码,在 gcc 6 中编译得很好,但在 gcc 7 中不能编译。请注意在 bar 的定义中使用了未声明的构造函数。如果在代码的其他地方引用了该函数,这应该会打印错误(取消注释 foo.bar() 会导致 gcc 6 打印错误)。但是,即使未使用该函数,gcc 7 也会打印错误。

一些更改导致代码也可以使用 gcc 7 进行编译(例如,如果 A 的定义中的 B 被替换为 T),而一些更改会导致它在 gcc 6 中失败(例如,如果未使用 this->)。这里发生了什么? gcc 何时决定编译未使用的模板代码?不同版本的gcc使用不同的规则来决定吗?

struct B {};

template <typename T>
struct A {

B* bar()
{
// undeclared constructor
return new B(this->b);
}

B* b;
};

int main (int argc, char* argv[])
{
A<int> foo;

//foo.bar();
}

最佳答案

A::bar()是模板类中的非模板成员函数。如果它本身是一个模板,SFINAE 将允许代码在 bar() 时编译。没有被调用。但是你现在拥有它的方式,一次A使用一些模板参数实例化,所有这些都应该是有效的。

一个解决方案是:

template <typename T>
struct A {

template <typename X>
X* bar()
{
// static_assert(is_same<X, B>) if you want
return new X(this->b);
}

B* b;
};

然后你会调用a.bar<B>()而不是 a.bar() ,如果你不调用它,它就不会被实例化,也不会导致错误。

关于c++ - gcc 何时编译未使用的模板代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48969801/

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