问题标签 [if-constexpr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
188 浏览

c++ - 如何决定 constexpr 是否返回引用

如果您有一个if constexpr ()决定做一件事或另一件事的函数,如何在一种情况下返回左值,在另一种情况下返回右值?

以下示例在第一个用法行中没有编译,因为返回类型auto为无引用:

0 投票
2 回答
210 浏览

c++ - if constexpr vs if with constant

如这个问题所示:link,如果两个if分支都有效,则没有区别:

在优化方面(在这两种情况下,else分支都不会被实例化)。if因此,如果可以在编译时检查vanilla 中的表达式(它涉及 a constor constexpr) - 优化也可以在这里工作。

我以前认为这是 的目的if constexpr,但我错了。那么除了案例之外是否还有其他用例,if constexpr那么我们可能只有许多if分支中的一个有效?

0 投票
1 回答
415 浏览

c++ - 在什么意义上 std::disjunction 在 compile_time 短路

cppreference.com上的描述来看,我的印象是 std::disjunction 旨在让我在编译时短路,这样我就可以像这样使用它:

但是,这不会编译, std::disjunction 不会短路,因为上面的 static_assert 不会触发(现场示例)。

但那它短路又有什么意义呢?这不可能是 || 的通常行为 在运行时,因为 std::disjunction 的类型必须在编译时知道,它取决于它的值。

0 投票
2 回答
507 浏览

c++ - 有条件地在类中创建成员

是否可以执行以下操作:

或者

使用 c++17?我想根据可以在编译时检查的某些条件来更改类的结构。有什么办法可以做到这一点?

0 投票
1 回答
654 浏览

c++ - 在模板函数内的 lambda 内不会丢弃“if constexpr 分支”

以下代码

不使用 Clang 编译,但使用 GCC 编译。我看不出这段代码有什么问题,但我不确定。Clang 是不是没有编译它?

0 投票
1 回答
323 浏览

g++ - 如何在编译时使用 boost::hana 正确检查成员?

我正在编写一个物理模拟程序,我想做以下事情:我有一个 hana 适应结构,我想在编译时检查这个结构是否有名为“absorbedEnergy”的成员,使用:

在我使用的 c++17 中这样做的正确方法是什么?

现在使用hana文档我想出了这个:

问题是它可以用 g++ 7.4.0 编译得很好,并且符合我的预期,但无法用 clang++-8 编译。它给出了一个错误:

constexpr 如果条件不是常量表达式

我怀疑这源于 has_absorbedEnergy 的论点 - 细胞不是恒定的表达。有没有解决的办法?

0 投票
1 回答
214 浏览

c++ - “if constexpr(something false)”是否总是省略模板实例化

这个模板函数f<X>()是否总是不被实例化?

下面是我的测试(coliru MCVE)。
我创建fun<S>()了它将实例化E<S>当且仅当S!=void.
然后我打电话给fun<void>(),fun<int>()fun<float>()

我相信强制 C++ 编译器if constexpr(false)跳过#1. 我的应该只有2次。 fun<void>()
countRunner++

因此,如果我的假设是正确的,那么下面的程序将始终在每个编译器和每个设置中打印 2。

(它为我打印了 2,但仅凭实验证明什么。)

我可以E<void>相信永远不会被实例化吗?
请提供一些(半)官方参考,让我冷静下来。

编辑:我刚刚发现http://eel.is/c++draft/stmt.if#2C++17 中的“If constexpr”在非模板函数中不起作用

如果if语句的形式为if constexpr,则条件的值应为 bool 类型的上下文转换的常量表达式;这种形式称为constexpr if语句。如果转换条件的值为假,则第一个子语句是丢弃的语句,否则第二个子语句(如果存在)是丢弃的语句。在封闭模板化实体的实例化过程中,如果条件在其实例化后不依赖于值,则丢弃的子语句(如果有)不会被 实例化。[ 注意:废弃语句中的 Odr 使用不需要定义实体。— 尾注]案例默认值出现在这种if语句中的标签应与同一if语句中的 switch 语句相关联。在 constexpr if 语句的子语句中声明的标签只能由同一子语句中的语句引用。

我仍然不确定规则中的“实例化”一词。它与“模板实例化”中的含义相同吗?

0 投票
2 回答
847 浏览

c++ - 如果 `if constexpr` 不匹配,则停止编译

我有一个模板函数,它检查模板参数的类型,if constexpr例如

if constexpr如果我的 s 都不匹配,如何使代码无法编译?

0 投票
2 回答
200 浏览

c++ - 从“if constexpr”分支扩展对象生命周期/范围

假设我们有以下代码

在这里,我if constexpr用来确定该类是否可默认构造(或不可构造),然后相应地创建一个对象。在某种程度上,我天真地认为这会将不同的分支简化为正确的分支,即

简单地变成

但实际上,可能更像这样

但是问题就变成了(回到第一个例子),我怎样才能将myObj范围保持在{ ... }?

0 投票
1 回答
389 浏览

c++ - 为什么这个 constexpr if 不能编译

我想通过使用constexpr函数而不是多constexpr if分支来简化代码。

这是带有旧代码注释的代码,旧代码使用msvc(vs 2017 with c++17) 和clang( android ndk r20) 编译,但使用clang 8in for windows x64in编译失败visual studio

并且新代码既不编译msvc也不clang

新代码在这一行编译失败:

msvc的错误代码是:

从铿锵声 8 :

但是所有的 null_value 在编译时都是已知的