假设你有一个函数可以为应用程序生成一些安全性令牌,例如一些散列盐,或者一个对称或不对称密钥.
现在让我们说你在C中有这个功能作为一个constexpr,并且你可以根据一些信息(比如编号,时间戳,别的东西)为你的build生成密钥.
你是一个勤奋的程序员,确保并以适当的方式调用它,以确保它只在编译时被调用,因此死机器从最终的可执行文件中删除代码.
但是,您无法确定别人不会以不安全的方式调用它,也可能编译器不会将功能删除,然后您的安全令牌算法将成为公共知识,使其成为更容易被攻击者猜测未来的令牌.
或者,除了安全性,假设该功能需要很长时间才能执行,并且您希望确保它在运行时不会发生,并为您的最终用户造成糟糕的用户体验.
有没有办法确保在运行时永远不能调用一个constexpr函数?或者,也可以在运行时抛出一个assert或者类似的代码,但是并不像编译错误那么明显.
我听说有一些方法涉及抛出一个不存在的异常类型,所以如果constexpr函数没有被破坏,你会得到一个链接器错误,但是听说这只适用于一些编译器.
解决方法
你可以强制使用它在一个常量表达式中:
#include<utility> template<typename T,T V> constexpr auto ct() { return V; } template<typename T> constexpr auto func() { return ct<decltype(std::declval<T>().value()),T{}.value()>(); } template<typename T> struct S { constexpr S() {} constexpr T value() { return T{}; } }; template<typename T> struct U { U() {} T value() { return T{}; } }; int main() { func<S<int>>(); // won't work //func<U<int>>(); }