【发布时间】:2016-07-30 08:01:18
【问题描述】:
考虑以下代码,它对undefinedFunction 进行了无法访问的调用。
void undefinedFunction();
template <bool b = false>
void foo()
{
static_assert(b == false);
if (b)
undefinedFunction();
}
int main()
{
foo();
}
GCC 毫无怨言地编译和链接它。使用static_assert,很难看出编译器如何做不同的事情,但是标准对此有什么要说的吗?如果static_assert 被删除怎么办?编译器是否有义务删除分支,或者它实际上是否可以发出无法访问的调用指令,导致链接器抱怨?
【问题讨论】:
-
在一般情况下确定无法访问的代码并非易事......
-
删除死代码是优化器的工作,而不是代码生成器。如果你当时没有打开它,你打赌,你会让链接器抱怨。该标准没有规定优化器应该如何完成其工作。顺便说一句,很难猜到为什么你自己看不到这个,修改 -O 选项。
-
我相信这是一个错误。此代码不应编译,因为当模板函数
foo被实例化时,undefinedFunction是 odr-used。如果分支不会被评估原因b == false无关紧要。 -
@Hans,我确实尝试过优化和不优化,并且 gcc 在这两种情况下都成功构建,但你的观点是有道理的。
-
它可能没有链接 - 但程序格式错误,不需要诊断,所以它看起来也可以正常工作。
标签: c++ c++11 c++14 template-meta-programming