问题标签 [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 回答
2207 浏览

c++ - 为什么 if constexpr 需要 else 才能工作?

我正在尝试通过if constexpr以下方式使用:

示例用例:

但这无法编译

铿锵声

海湾合作委员会

但是我发现添加后错误就消失了else

现场演示

发生了什么?为什么编译器不能else在这种情况下推断出?

0 投票
1 回答
90 浏览

c++ - 为什么如果 constexpr 未能绕过 constexpr 评估?

我正在为使用宏进行类型分派构建一个静态循环。这是我到目前为止所取得的成就。

和godbolt链接 https://godbolt.org/z/GcMZI3

问题是,为什么前四个分支编译失败?

0 投票
2 回答
2067 浏览

c++ - std::is_constant_evaluate 行为

GCC9 已经实现了std::is_constant_evaluated. 我用它玩了一点,我意识到它有点棘手。这是我的测试:

根据这些结果,我得出以下结论:

  • if constexpr (std::is_constant_evaluated())总是评估 true分支。因此,使用这种结构是没有意义的。

  • 如果编译器在编译时评估一个变量, std::is_constant_evaluated())则 is true,无论该变量是否被显式注释constexpr

我对吗?

0 投票
1 回答
817 浏览

c++ - `if constexpr` vs `if` 根据编译器优化和代码性能

func考虑一个对性能非常关键的函数模板。它可以用T=Type1或其他类型实例化。部分功能逻辑依赖于T它的实例化。

可以显式使用if constexpr(代码 B)或使用 vanillaif代替(代码 A),而编译器可能会优化代码。

但是,我想知道,没有constexpr(代码 A)的实现有何不同?编译器是否不能if实例化时检测在编译时使用(在代码 A 中)的哪个分支?它还能(对于代码 A)生成效率较低的代码吗?

代码 A.没有 if constexpr

代码 B.使用 if constexpr

代码 A 和 B 都可以编译,do something并且do something else对于任何T.

有一些类似的问题:

如果出于某种原因代码 B 比代码 A 更可取(当两个分支都格式良好时),上述问题无法回答。

我看到的唯一优点是明确告诉程序员这if是编译时;但是,我会说条件表达式是不言自明的。

0 投票
2 回答
2391 浏览

c++ - 如何在 if-constexpr 中使用概念?

一个人如何使用概念if constexpr

给定下面的例子,如果满足和 0 的要求,if constexpr返回 1会给出什么?Tintegral

0 投票
0 回答
92 浏览

c++ - static_assert(false) 的实际解决方法;在 else constexpr{}

如何轻松static_assert(false)inelse{}if constexpr

上述 MCVE 不可编译。
原因在constexpr if 和 static_assert中进行了解释 。
(这个问题更像是语言律师的问题。)

在这个问题中,我想知道一个优雅的解决方法。

我糟糕的解决方案

第一个解决方法(将条件复制粘贴到#1):-

^ 它不易维护+脏。

我的第二次尝试(缓存为constexpr bool):-

^ 它不太清楚而且相当混乱。

在现实世界中,complexIf是一个管理自定义智能指针的功能。
每个if constexpr主要是关于检查指针的类型。

0 投票
2 回答
1617 浏览

c++ - 在 lambda 中捕获的 constexpr 变量失去了它的 constexpr-ness

这段代码在 g++ ( coliru ) 中编译得很好,但在 MSVC ( godbolt和我的 VS2017) 中编译得不好。

(6): 错误 C2131: 表达式未计算为常数
(6): 注意: 失败是由在其生命周期之外读取变量引起的
(6): 注意: 请参阅“this”的用法

哪一个(g++ 或 MSVC)错了?“查看‘this’的用法”中有
什么内容??this

如何在保持编译时保证的同时解决它?

在我的真实情况下,b (#1)一个复杂的语句取决于其他几个 constexpr 变量。

0 投票
1 回答
497 浏览

c++ - 如果为 false,std::is_member_function_pointer 不会编译

我在找什么:我有一个模板类,如果该类有想要的函数,我想调用一个函数,比如:

会发生什么:T如果不带函数,编译器不会编译。小例子:

编译器说:

那么,std::is_member_function_pointer当我不能在其中使用它时,它是if constexpr什么?如果我只使用this->_t->x()编译器,肯定也会失败。

0 投票
1 回答
589 浏览

c++ - if constexpr 似乎仅在两种情况都有效时才有效

给定以下代码:

只有当我注释掉cout << vec.x << endl. 这显然不会编译,但我的理解if constexpr是:

如果值为true,则丢弃 statement-false(如果存在),否则丢弃 statement-true

因此,我认为应该丢弃“statement-true”,但似乎并非如此。如果我在“statement-true”中放置一个在任何一种情况下都有效的陈述,它就会起作用。但是我得到一个可能无效的声明:

错误:class std::vector<int>没有名为的成员x

我在这里做错了吗?

Live Example

0 投票
3 回答
5828 浏览

c++ - C++ 检查语句是否可以评估 constexpr

有没有一种方法可以决定是否可以对某些东西进行 constexpr 评估,并将结果用作 constexpr 布尔值?我的简化用例如下:

我的目标是 C++2a。

我找到了以下 reddit 线程,但我不是宏的忠实粉丝。https://www.reddit.com/r/cpp/comments/7c208c/is_constexpr_a_macro_that_check_if_an_expression/