问题标签 [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 投票
0 回答
107 浏览

visual-c++ - 如果使用在另一个类模板中使用 if constexpr 语句的类模板,则 Visual-C++ 编译失败

我编写了一个矩阵类模板,其中包括专门用于某些类模板参数的算术运算符,这些参数使用 if constexpr 语句。如果使用Visual C++ 编译器(版本 19.00.24245)编译,则在另一个模板类中使用此矩阵类可能会导致在初始化之前无法使用形式为“符号”的大量错误消息。如果矩阵类模板在另一个类模板中使用,然后在 Linux 上使用 g++ 7.4.0 或最新的 Apple clang 版本编译,或者如果在非类模板中使用,然后使用 Visual-C++ 编译器编译,编译成功。

为了能够重现上述问题,下面给出了包含矢量类模板和一个运算符的代码段,该运算符模仿了上述矩阵类的结构、编译器标志以及错误消息。注释掉第 160 行并将注释形式的第 185 行切换到第 186 行会导致编译情况。

我的第一个问题是上面的代码是否有问题,即它不符合 C++17 标准,或者编译器标志是否丢失,或者编译错误是由于 Visual- C++ 编译器?此外,我在问,如何修改代码以使用 Visual Studio 编译器进行编译而不改变其一般结构,例如,放弃使用 if constexpr 语句?(不使用模板特化(在矩阵类中)的原因是它会显着增加代码大小,因为需要对多个模板参数进行特化并且还接受代理类作为参数。)

0 投票
3 回答
480 浏览

c++ - 如何让编译器忽略这个评估为假的 if-constexpr?

0 投票
2 回答
152 浏览

c++ - 在编译时评估“if”子句

考虑以下代码片段:

我想知道“if constexpr”子句在这里是否真的有用。编译器是否不够聪明,无法确定给定 UIntT 的“if”子句是否为真?如果是这样,这是标准规定的吗?

0 投票
2 回答
3493 浏览

c++ - C++ 17 有静态反射吗?

结合if constexpr一些<type_traits>实体,在 C++17 中,我能够在编译时检查类型。这些技术可以被认为是静态反射吗?还是只是类型检查?例子:

反射概念是否仅适用于运行时?称其为静态反射是否正确?

0 投票
2 回答
143 浏览

c++ - 对“if constexpr”的错误理解

我有以下代码

编译

-std=gnu++17

我的假设

是在编译期间

被丢弃,我没有得到关于未定义的错误

X

我的理解是错误的,这个'if constexpr'类似于

如何修改可以编译的代码?

谢谢您的帮助

0 投票
1 回答
120 浏览

c++ - 如何通过通用引用或 std::forward 将这三个 c++ 模板函数合并为一个?

我把这些代码搞砸了

我可以使用通用参考或 std::forward 或 if constexpr 或 enable_if 来放大这些代码。

unique_ptr 存储 T 的点(作为 T*),因为这些代码包装了第三方 c 代码,将结构的原始 malloc 包装成 RAII unique_ptr 样式。

只需合并三个 CustomF* 结构 -> 一个 CustomF0 结构

0 投票
1 回答
173 浏览

switch-statement - if constexpr 等效于 switch

从 C++17 开始,模板函数可以在编译时计算的表达式的函数中返回一种或另一种类型:

有没有等价的switch?

我没有成功尝试过:

0 投票
2 回答
1605 浏览

c++ - constexpr 如果测试一个模板参数

如果我有一个有两个模板参数的类,有没有办法只在其中一个参数上分支 if constexpr?在下面的示例中,我可以测试两个参数是否匹配,但我想要一种匹配任何以 char 作为其第一个参数的 MyTemplateClass 版本的方法。

0 投票
1 回答
833 浏览

c++ - if constexpr - 为什么完全检查丢弃的语句?

我在 GCC 10 中使用 c++20 consteval 并编写了这段代码

它应该像 STL 查找算法一样工作,但在元组上而不是返回迭代器,它返回基于编译时谓词的可选索引。现在这段代码编译得很好并且打印出来了

9

但是,如果元组不包含整数类型的元素,则程序不会编译,因为 i.value() 仍然在空的可选项上调用。为什么会这样?

0 投票
2 回答
484 浏览

c++ - 在 C++ 中进行 N 阶乘编译时间的 3 种不同/相同方法

我正在尝试使用模板元编程、constexpr 和 if constexpr,并提出了 3 种不同的方法来进行 N 递归/N 阶乘运算。

所有三个示例都是我在 SO 上或通过在网上搜索找到的 - 然后对其进行了修改,所以它们也是一样的

第一个示例是使用模板元编程:示例 1

第二个仍在使用模板,但我在示例 2中抛出了一个 constexpr

第三个,是我删除模板并“仅”使用 constexpr 的地方:示例 3

在我看来,所有三个都做同样的事情 - 当输入数字是编译时间常数时。这三个都是递归的,所有三个都在编译时工作。

我的问题是——这三者有什么区别?哪一个最可取?

最后——我想实现“if constexpr”但没能实现,所以我的解决方法是在示例 3 中执行“if 语句”——这并不是真正的 if 语句,但是如果 - 如果它以任何方式相同,我可以得到最接近编译时间,我不确定。