作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下代码片段:
#include <limits>
#include <stdexcept>
void g(unsigned) {
// ...
}
template<typename UIntT>
void f(UIntT n)
{
if constexpr (std::numeric_limits<UIntT>::max() > std::numeric_limits<unsigned>::max())
{
if (n > std::numeric_limits<unsigned>::max())
throw std::length_error("Too long.");
}
g(n);
}
我想知道“if constexpr”子句在这里是否真的有用。难道编译器不够聪明,无法找出“if”子句对于给定的 UIntT 是否为真吗?如果是这样,这是标准规定的吗?
最佳答案
Aren't compilers smart enough to find out whether the
if
clause can ever be true for a givenUIntT
?
大多数都是。
If so, is this mandated by the standard?
不,一些优化已经被命名(RVO:s 等),并且后来被纳入语言标准,但 DEADC0DE
优化并未标准化(据我所知)。
constexpr
是合格的编译器不可能会在生成的二进制文件中保留该 block (如果条件为false
) - 但您决定优化代码。
关于c++ - 在编译时评估 'if' 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58138867/
我是一名优秀的程序员,十分优秀!