【问题标题】:Force compile time evaluation of constexpr with clang使用 clang 强制编译时评估 constexpr
【发布时间】:2016-08-13 20:14:33
【问题描述】:

要在编译时强制评估 constexpr 函数,我应该 能够将其返回值分配给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,创建一个新的函数来分配 将值返回给constexpr 变量并返回它。

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++ 返回编译器错误:

错误:constexpr 变量 'b' 必须由常量表达式初始化

我正在做的事情是否被允许?还是clang 有限制?还是gcc 允许?

cpp.godbolt.org: gcc 6.1 & clang 3.8

【问题讨论】:

  • double & 必须是 constexpr

标签: c++ g++ c++14 constexpr clang++


【解决方案1】:

constexpr bool const_d_ref(const double& v) { 中的v 不是编译时表达式。因此detail::const_d_ref(v) 也不是编译时表达式。

如果您将b 更改为const,您的示例将起作用:

const bool b = detail::const_d_ref(v);

cpp.godbolt.org

【讨论】:

  • 即使v 从未在正文中使用过?
  • @Yakk ...提示疯狂搜索被称为“标准”的密码学...
  • const_d_ref的正文中没有使用。
  • @Yakk:啊,detail::const_d_ref,正确。但是v::const_d_ref 中使用。我的第一句话指的是::const_d_refconstexpr 函数的参数永远不能在所述函数中被视为 constexpr。但是 C++14 constexpr 函数可以有非constexpr 局部变量。例如:github.com/HowardHinnant/date/blob/master/date.h#L2457-L2474
  • @Ram-Z:当您不声明变量 constexpr 时,您授予编译器在运行时初始化该变量的权限,即使由 constexpr 函数初始化也是如此。
猜你喜欢
  • 2012-02-01
  • 2020-10-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2013-07-13
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多