是否可以确保在编译时最多调用一次 constexpr 函数?
Is it possible to ensure a constexpr function is called at most once at compile time?
如题:能否保证一个constexpr函数在编译时最多被调用一次?
如果函数不是 constepxr,这显然是不可能的;我可以编写一个函数,每当我按下 space 栏时都会调用该函数,因此编译器永远无法在编译时计算出来。
简短回答: 不,因为 constexpr
函数不能 read/set 外部状态。 (他们可以有内部状态,但他们仍然需要"pure").
真实答案:可能是,但这是个坏主意。 Filip Roséen 发表了一系列博客文章,其中涵盖了通过滥用 friend
ship 和 ADL 实现有状态 constexpr
函数:
"NON-CONSTANT CONSTANT-EXPRESSIONS IN C++" - (cached by Google)
"HOW TO IMPLEMENT A CONSTANT-EXPRESSION COUNTER IN C++" - (cached by Google)
"HOW TO IMPLEMENT A COMPILE-TIME META-CONTAINER IN C++" - (cached by Google)
这项技术非常神秘和复杂。它被 CWG 视为滥用功能,which is trying to make it ill-formed with issue #2118。
如题:能否保证一个constexpr函数在编译时最多被调用一次?
如果函数不是 constepxr,这显然是不可能的;我可以编写一个函数,每当我按下 space 栏时都会调用该函数,因此编译器永远无法在编译时计算出来。
简短回答: 不,因为 constexpr
函数不能 read/set 外部状态。 (他们可以有内部状态,但他们仍然需要"pure").
真实答案:可能是,但这是个坏主意。 Filip Roséen 发表了一系列博客文章,其中涵盖了通过滥用 friend
ship 和 ADL 实现有状态 constexpr
函数:
"NON-CONSTANT CONSTANT-EXPRESSIONS IN C++" - (cached by Google)
"HOW TO IMPLEMENT A CONSTANT-EXPRESSION COUNTER IN C++" - (cached by Google)
"HOW TO IMPLEMENT A COMPILE-TIME META-CONTAINER IN C++" - (cached by Google)
这项技术非常神秘和复杂。它被 CWG 视为滥用功能,which is trying to make it ill-formed with issue #2118。