关于 constexpr 的使用

学术版

`<cmath>` 库函数添加 `constexpr` 是 C++23 的版本特性,虽然在那之前部分编译器就给部分函数进行了添加,但是这与编译器种类与版本有关。
by gxy001 @ 2024-04-24 13:16:11


@[gxy001](/user/55707) 不过既然评测机用的 GCC,那这种性质应该是 NOIP,CSP 等比赛中也能用的吧?
by zhangbo1000 @ 2024-04-24 13:31:52


[https://stackoverflow.com/questions/27744079/is-it-a-conforming-compiler-extension-to-treat-non-constexpr-standard-library-fu](https://stackoverflow.com/questions/27744079/is-it-a-conforming-compiler-extension-to-treat-non-constexpr-standard-library-fu) **TL;DR** 根据 C++ 标准, `constexpr` 变量只能被常量表达式初始化, 因此, 非 `constexpr` 函数 `std::acos` 不能初始化 `pi`. GCC 允许这种行为, 但是这是不符合标准的. 而使用 Clang 编译就会正常报错. ``` <source>:5:18: error: constexpr variable 'pi' must be initialized by a constant expression 5 | constexpr double pi = acos(-1); | ^ ~~~~~~~~ /opt/compiler-explorer/gcc-snapshot/lib/gcc/x86_64-linux-gnu/14.0.1/../../../../include/c++/14.0.1/cmath:106:14: note: subexpression not valid in a constant expression 106 | { return __builtin_acos(__x); } | ^~~~~~~~~~~~~~ <source>:5:23: note: in call to 'acos<int>(-1)' 5 | constexpr double pi = acos(-1); | ^~~~~~~~ 1 error generated. Compiler returned: 1 ``` 不过已经有提案建议为 cmath 库添加更多 `constexpr` 函数, 参见 [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1383r2.pdf](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1383r2.pdf) 另外, 洛谷/小熊猫 Dev C++ 不代表任何语言标准, 编译时报错是编译器决定的, 洛谷环境请参考 [https://help.luogu.com.cn/manual/luogu/problem/judging#languages](https://help.luogu.com.cn/manual/luogu/problem/judging#languages), 而 VS Code 的错误提示是你所使用的相关的 extension 的决定的. 如果想要了解不同编译器差别, 可以使用 [https://godbolt.org/](https://godbolt.org/)
by 望月Asta @ 2024-04-24 13:39:30


@[zhangbo1000](/user/760291) 按照 [这里](https://www.noi.cn/gynoi/jsgz/2021-07-16/732450.shtml), G++ 版本 9.3.0 , 编译选项 `-std=c++14 -O2` 不会报错, 可以使用.
by 望月Asta @ 2024-04-24 13:53:51


|