使用 clang 强制编译时评估 constexpr
Force compile time evaluation of constexpr with clang
要在编译时强制计算 constexpr
函数,我应该
能够将其 return 值分配给 constexpr
变量。
constexpr bool const_d_ref(const double& v) { return false; }
int main() {
constexpr double dd = 0.0;
constexpr bool cb = const_d_ref(dd);
}
这似乎适用于 g++
和 clang++
。
为了对消费者隐藏constexpr
,我移动了实际的功能
定义到 namespace detail
中,创建一个新函数来赋值
return 值到 constexpr
变量和 return 它。
namespace detail {
constexpr bool const_d_ref(const double& v) { return false; }
}
constexpr bool const_d_ref(const double& v) {
constexpr bool b = detail::const_d_ref(v);
return b;
}
int main() {
constexpr double dd = 0.0;
bool b = const_t_ref(dd);
constexpr bool cb = detail::const_t_ref(dd);
}
它按预期与 g++
一起工作,但是 clang++
return 编译器错误:
error: constexpr variable 'b' must be initialized by a constant expression
我的行为是被允许的吗?或者 clang
是限制性的?还是 gcc
过于宽容?
v
in constexpr bool const_d_ref(const double& v) {
不是编译时表达式。因此 detail::const_d_ref(v)
也不是编译时表达式。
如果将 b
更改为 const
,您的示例将起作用:
const bool b = detail::const_d_ref(v);
要在编译时强制计算 constexpr
函数,我应该
能够将其 return 值分配给 constexpr
变量。
constexpr bool const_d_ref(const double& v) { return false; }
int main() {
constexpr double dd = 0.0;
constexpr bool cb = const_d_ref(dd);
}
这似乎适用于 g++
和 clang++
。
为了对消费者隐藏constexpr
,我移动了实际的功能
定义到 namespace detail
中,创建一个新函数来赋值
return 值到 constexpr
变量和 return 它。
namespace detail {
constexpr bool const_d_ref(const double& v) { return false; }
}
constexpr bool const_d_ref(const double& v) {
constexpr bool b = detail::const_d_ref(v);
return b;
}
int main() {
constexpr double dd = 0.0;
bool b = const_t_ref(dd);
constexpr bool cb = detail::const_t_ref(dd);
}
它按预期与 g++
一起工作,但是 clang++
return 编译器错误:
error: constexpr variable 'b' must be initialized by a constant expression
我的行为是被允许的吗?或者 clang
是限制性的?还是 gcc
过于宽容?
v
in constexpr bool const_d_ref(const double& v) {
不是编译时表达式。因此 detail::const_d_ref(v)
也不是编译时表达式。
如果将 b
更改为 const
,您的示例将起作用:
const bool b = detail::const_d_ref(v);