template <typename... Ts>
void error(ErrorNumber n, Ts&&... ts) {
static_assert(are_arguments_valid<Ts...>(n));
/* do error stuff */
}
是这样吗?把帖子里的assert改成 static_assert。
这样编译不过,因为要访问n,n不是constexpr.
作者说了,无法把error(...)函数声明为constexpr,因为do error stuff里有很多与constexpr相悖的代码。-- "because it does a lot of constexpr-unfriendly things."
他的逻辑点是,expreval妙在可以命令编译器,编译时就把语句执行了。
他的感情点是,constexpr are_arguments_valid(...)已经能编译时检测了,惜乎功亏2篑:
1 无法silently check. 得改代码,在调用error()之前,加一层。—— 这样的call site太多了……
2 想要silently check,可是error()又无法声明为constexpr。—— 改error动静也太大。
真难。
consteval真好。上了这套后,抓了120处编译器Bug,要么是参数个数不对,要么是类型不对。
【 在 ziqin 的大作中提到: 】
: 它举的那个例子 在c++17里 用static_assert不就行了?
--
FROM 61.185.158.*