康斯坦特还行,但不是康特克斯普尔?
const ok, but not constexpr?
使用constexpr
指定的函数foo_constexpr
我有如下所示的代码:
const auto x = foo_constexpr(y);
static_assert(x==0);
在什么情况下,当x
声明更改为constexpr
时,代码无法编译?(毕竟,x
必须已经是用于static_assert
的常量表达式。那是:
constexpr auto x = foo_constexpr(y);
static_assert(x==0);
通常,当执行foo_constexpr
违反常量表达式的要求时,它可能无法编译。请记住,constexpr
函数不是始终是常量表达式的函数。相反,它是一个函数,可以至少为一个输入生成常量表达式!就是这样。
因此,如果我们要编写这个完全合法的函数:
constexpr int foo_constexpr(int y) {
return y < 10 ? 2*y : std::rand();
}
然后我们将得到:
constexpr int y = 10;
const auto x1 = foo_constexpr(y); // valid, execution time constant
constexpr auto x2 = foo_constexpr(y); // invalid, calls std::rand
但是,当然,如果x
已经在常量表达式(例如静态断言(中使用,则更改为constexpr
不会导致失败。
相关文章:
- 运行莱文斯坦代码时出现问题
- 康斯特指针C++斯特劳斯特鲁普
- 为什么斯科特·迈耶斯(Scott Meyers)建议更喜欢"迭代器"而不是"const_i
- Q 斯坦达项重定义错误
- 如何在特拉维斯CI中使用最新的提升版本?
- 如何在特拉维斯 CI 上安装 C++17 的 clang?
- 康斯坦特还行,但不是康特克斯普尔?
- C++ 克鲁斯卡尔算法的实现
- integral_constant vs 康特斯普尔
- 康特斯普的奇怪行为
- 在 Travis CI 上运行 C++ 测试时出现问题.Cmake 配置.如何在特拉维斯 ci 上运行测试套件?
- 使用弗洛伊德-斯坦伯格抖动不起作用
- 克鲁斯卡尔的算法解释
- 特拉维斯构建需要超过 50 分钟 - > 杀死
- 克鲁斯卡尔算法用矢量转换
- 常量与变量上的常量与康特克斯PR
- 斯科特·迈耶斯谈价值
- 如果我将类声明为常量,程序不起作用...而不是康特斯普?
- lexical_cast斯特托夫斯特托尔德失去了准确性
- 康斯坦德是做什么的?