考虑以下代码,该代码无法调用undefinedFunction
。
void undefinedFunction();
template <bool b = false>
void foo()
{
static_assert(b == false);
if (b)
undefinedFunction();
}
int main()
{
foo();
}
GCC对此进行了编译和链接,而没有提出投诉。使用
static_assert
,很难看到编译器如何做任何不同的事情,但是标准对此有什么要说的吗?如果删除了static_assert
怎么办?编译器是否有义务删除该分支,或者它是否实际上会发出无法访问的调用指令,从而导致链接器提示? 最佳答案
根据C++标准§3.2/p4一定义规则[basic.def.odr](强调我的):
模板函数foo
实例化了odt使用的undefinedFunction
(即,需要undefinedFunction
的定义)。不评估if
子句并不重要。因此,程序格式错误,并且由于不需要诊断,因此它可能会链接也可能不会链接。
关于c++ - 静态无法到达的调用会导致 undefined reference 错误吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36510053/