问题标签 [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.
c++ - 如何决定 constexpr 是否返回引用
如果您有一个if constexpr ()
决定做一件事或另一件事的函数,如何在一种情况下返回左值,在另一种情况下返回右值?
以下示例在第一个用法行中没有编译,因为返回类型auto
为无引用:
c++ - if constexpr vs if with constant
如这个问题所示:link,如果两个if
分支都有效,则没有区别:
和
在优化方面(在这两种情况下,else
分支都不会被实例化)。if
因此,如果可以在编译时检查vanilla 中的表达式(它涉及 a const
or constexpr
) - 优化也可以在这里工作。
我以前认为这是 的目的if constexpr
,但我错了。那么除了案例之外是否还有其他用例,if constexpr
那么我们可能只有许多if
分支中的一个有效?
c++ - 在什么意义上 std::disjunction 在 compile_time 短路
从cppreference.com上的描述来看,我的印象是 std::disjunction 旨在让我在编译时短路,这样我就可以像这样使用它:
但是,这不会编译, std::disjunction 不会短路,因为上面的 static_assert 不会触发(现场示例)。
但那它短路又有什么意义呢?这不可能是 || 的通常行为 在运行时,因为 std::disjunction 的类型必须在编译时知道,它取决于它的值。
c++ - 有条件地在类中创建成员
是否可以执行以下操作:
或者
使用 c++17?我想根据可以在编译时检查的某些条件来更改类的结构。有什么办法可以做到这一点?
c++ - 在模板函数内的 lambda 内不会丢弃“if constexpr 分支”
以下代码:
不使用 Clang 编译,但使用 GCC 编译。我看不出这段代码有什么问题,但我不确定。Clang 是不是没有编译它?
g++ - 如何在编译时使用 boost::hana 正确检查成员?
我正在编写一个物理模拟程序,我想做以下事情:我有一个 hana 适应结构,我想在编译时检查这个结构是否有名为“absorbedEnergy”的成员,使用:
在我使用的 c++17 中这样做的正确方法是什么?
现在使用hana文档我想出了这个:
问题是它可以用 g++ 7.4.0 编译得很好,并且符合我的预期,但无法用 clang++-8 编译。它给出了一个错误:
constexpr 如果条件不是常量表达式
我怀疑这源于 has_absorbedEnergy 的论点 - 细胞不是恒定的表达。有没有解决的办法?
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#2和C++17 中的“If constexpr”在非模板函数中不起作用。
如果if语句的形式为if constexpr,则条件的值应为 bool 类型的上下文转换的常量表达式;这种形式称为constexpr if语句。如果转换条件的值为假,则第一个子语句是丢弃的语句,否则第二个子语句(如果存在)是丢弃的语句。在封闭模板化实体的实例化过程中,如果条件在其实例化后不依赖于值,则丢弃的子语句(如果有)不会被 实例化。[ 注意:废弃语句中的 Odr 使用不需要定义实体。— 尾注]案例或默认值出现在这种if语句中的标签应与同一if语句中的 switch 语句相关联。在 constexpr if 语句的子语句中声明的标签只能由同一子语句中的语句引用。
我仍然不确定规则中的“实例化”一词。它与“模板实例化”中的含义相同吗?
c++ - 如果 `if constexpr` 不匹配,则停止编译
我有一个模板函数,它检查模板参数的类型,if constexpr
例如
if constexpr
如果我的 s 都不匹配,如何使代码无法编译?
c++ - 从“if constexpr”分支扩展对象生命周期/范围
假设我们有以下代码
在这里,我if constexpr
用来确定该类是否可默认构造(或不可构造),然后相应地创建一个对象。在某种程度上,我天真地认为这会将不同的分支简化为正确的分支,即
简单地变成
但实际上,可能更像这样
但是问题就变成了(回到第一个例子),我怎样才能将myObj
范围保持在{ ... }
?
c++ - 为什么这个 constexpr if 不能编译
我想通过使用constexpr
函数而不是多constexpr
if
分支来简化代码。
这是带有旧代码注释的代码,旧代码使用msvc
(vs 2017 with c++17
) 和clang
( android ndk r20
) 编译,但使用clang 8
in for windows x64
in编译失败visual studio
!
并且新代码既不编译msvc
也不clang
新代码在这一行编译失败:
msvc的错误代码是:
从铿锵声 8 :
但是所有的 null_value 在编译时都是已知的