正如标题所问:是否可以确保在编译时最多调用一次 constexpr 函数?
如果函数不是 constepxr,这显然是不可能的;我可以编写一个在我按下空格键时调用的函数,因此编译器在编译时永远无法解决这个问题。
简短回答:不,因为constexpr
函数无法读取/设置外部状态。(它们可以有内部状态,但它们仍然需要是“纯的”)。
真正的答案:可能是的,但这是一个坏主意。Filip Roséen有一系列博客文章,其中涵盖了constexpr
通过滥用friend
ship 和 ADL 来实现有状态功能:
该技术非常神秘和复杂。它被 CWG 认为是对功能的滥用,它试图通过 issue #2118使其格式不正确。