通常,它指的是使函数不可用,例如,如果要禁止在程序中使用动态分配,则可以“中毒”该malloc
函数,使其无法使用。
在视频中,他以一种更特定的方式使用它,如果您阅读了他谈到中毒该功能时显示的幻灯片,则可以清楚地看到它,其中说“一种仅强制编译时间的方法?”
因此,他谈论的是“中毒”该函数以使其在运行时不可调用,因此只能在常量表达式中调用。该技术是在函数中有一个分支,该分支在编译时上下文中调用时永远不会占用,并使该分支包含会导致错误的内容。
throw
constexpr函数中允许使用表达式,只要在该函数的编译时调用中从未达到过该表达式即可(因为您不能在编译时抛出异常,所以它是一种固有的动态操作,例如分配内存)。因此,引用未定义符号的throw表达式将不会在编译时调用期间使用(因为编译失败),并且无法在运行时使用,因为未定义符号会导致链接器错误。
由于未定义的符号在函数的编译时调用中不是“奇特使用的”,因此实际上编译器不会创建对该符号的引用,因此可以确定未定义的符号。
那有用吗?他正在演示如何执行此操作,而不必说这是一个好主意或广泛有用。如果由于某种原因需要这样做,那么他的技术可能会解决您的问题。如果您不需要它,则无需担心。
可能有用的原因之一是某些操作的编译时版本效率不高。constexpr函数中允许的表达式种类有一些限制(尤其是在C ++ 11中,在C ++ 14中已删除了一些限制)。因此,您可能有两种版本的函数来执行计算,一种是最佳版本,但使用的是constexpr函数中不允许使用的表达式,而另一种版本是有效的constexpr函数,但是如果在运行时调用,性能会很差-时间。您可以毒化次优版本,以确保它永远不会用于运行时调用,从而确保更有效的版本(非constexpr)用于运行时调用。
注意:在编译时使用constexpr函数的性能并不是很重要,因为它始终没有运行时开销。它可能会使编译器执行额外的工作,从而减慢编译速度,但不会增加运行时性能成本。