【发布时间】:2018-08-04 19:19:53
【问题描述】:
我有以下(诚然是人为的)代码,在 gcc 6 中编译得很好,但在 gcc 7 中不能编译。请注意在 bar 的定义中使用了未声明的构造函数。如果该函数曾在代码的其他地方被引用,这应该会打印一个错误(取消注释foo.bar() 会导致 gcc 6 打印一个错误)。但是,gcc 7 即使不使用该函数也会打印错误。
某些更改会导致代码也使用 gcc 7 进行编译(例如,如果 B 在 A 的定义中被替换为 T),而某些更改会导致它无法使用 gcc 6 进行编译(例如,如果 @987654326 @ 未使用)。这里发生了什么? 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<int>实例化,编译器也会拒绝你的代码,因为它可以证明无论 T,函数 bar 永远不会有效。但它不是必须的,它被添加是因为它被认为是有帮助的。
标签: c++ templates gcc copy-constructor