问题标签 [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++ - std::is_constant_evaluate 行为
GCC9 已经实现了std::is_constant_evaluated
. 我用它玩了一点,我意识到它有点棘手。这是我的测试:
根据这些结果,我得出以下结论:
if constexpr (std::is_constant_evaluated())
总是评估true
分支。因此,使用这种结构是没有意义的。如果编译器在编译时评估一个变量,
std::is_constant_evaluated())
则 istrue
,无论该变量是否被显式注释constexpr
。
我对吗?
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
.
有一些类似的问题:
- 为什么
constexpr if
需要?– 这一个在需要时回答constexpr
。 if
和之间constexpr if
的区别——只列出区别
如果出于某种原因代码 B 比代码 A 更可取(当两个分支都格式良好时),上述问题无法回答。
我看到的唯一优点是明确告诉程序员这if
是编译时;但是,我会说条件表达式是不言自明的。
c++ - 如何在 if-constexpr 中使用概念?
一个人如何使用概念if constexpr
?
给定下面的例子,如果满足和 0 的要求,if constexpr
返回 1会给出什么?T
integral
c++ - static_assert(false) 的实际解决方法;在 else constexpr{}
如何轻松static_assert(false)
inelse{}
的if constexpr
?
上述 MCVE 不可编译。
原因在constexpr if 和 static_assert中进行了解释 。
(这个问题更像是语言律师的问题。)
在这个问题中,我想知道一个优雅的解决方法。
我糟糕的解决方案
第一个解决方法(将条件复制粘贴到#1
):-
^ 它不易维护+脏。
我的第二次尝试(缓存为constexpr bool
):-
^ 它不太清楚而且相当混乱。
在现实世界中,complexIf
是一个管理自定义智能指针的功能。
每个if constexpr
主要是关于检查指针的类型。
c++ - 如果为 false,std::is_member_function_pointer 不会编译
我在找什么:我有一个模板类,如果该类有想要的函数,我想调用一个函数,比如:
会发生什么:T
如果不带函数,编译器不会编译。小例子:
编译器说:
那么,std::is_member_function_pointer
当我不能在其中使用它时,它是if constexpr
什么?如果我只使用this->_t->x()
编译器,肯定也会失败。
c++ - if constexpr 似乎仅在两种情况都有效时才有效
给定以下代码:
只有当我注释掉cout << vec.x << endl
. 这显然不会编译,但我的理解if constexpr
是:
如果值为
true
,则丢弃 statement-false(如果存在),否则丢弃 statement-true
因此,我认为应该丢弃“statement-true”,但似乎并非如此。如果我在“statement-true”中放置一个在任何一种情况下都有效的陈述,它就会起作用。但是我得到一个可能无效的声明:
错误:
class std::vector<int>
没有名为的成员x
我在这里做错了吗?
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/