我有以下(诚然是人为的)代码,可以在 gcc 6 中编译得很好,但不能在 gcc 7 中编译。请注意,在定义中使用了未声明的构造函数bar
。如果函数在代码中的其他地方被引用(取消注释),这应该打印一个错误foo.bar()
导致 gcc 6 打印错误)。然而,即使不使用该函数,gcc 7 也会打印错误。
一些更改导致代码也可以使用 gcc 7 进行编译(例如,如果B
被替换为T
在定义中A
),而一些更改会导致 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()
,如果你不调用它,它不会被实例化,也不会导致错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)