给出以下示例代码
struct S;
template<typename>
class C
{
public:
void f(bool b)
{
if (b)
g();
}
void g()
{
S{};
}
};
int main()
{
C<int>{}.f(false);
}
GCC 正确报告以下内容:
example.cpp: In instantiation of 'void C< <template-parameter-1-1> >::g() [with <template-parameter-1-1> = int]':
10 : required from 'void C< <template-parameter-1-1> >::f(bool) [with <template-parameter-1-1> = int]'
21 : required from here
15 : error: invalid use of incomplete type 'struct S'
我现在的问题是:这种有保证的行为是否在标准或任何其他文件中有一些规定?
更准确地说我的问题:
C
是一个模板类,它的成员只有在被引用f()
时g()
才会被实例化。f()
中引用main()
。如果我不引用g()
(它在内部尝试使用不完整的类型),则代码将编译。但是g()
在 if-branch inside 中被引用f()
。这个分支确定性地永远不会被执行。因此编译器可能会忽略/删除这个死代码分支,从而避免实例化g()
(以及尝试使用不完整类型的错误)。但是,这并没有发生(至少在我尝试过的编译器上)。
我知道允许这样做只会通过调整编译器的优化设置将非法代码变成合法代码,但我的问题仍然是这个代码示例是否由于某些规则(例如优化顺序与模板传递)而保证失败可以在某处阅读。
感谢您的任何见解。