考虑以下代码,该代码无法调用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/

10-11 18:09