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

c++ - if constexpr 在内部伪造 static_assert 的最佳方法?

您可能知道 static_assert 不关心它是否在 if constexpr 的“活动”分支内(它总是“运行”)。

我有一个 hack 解决方法,它使用无效的数组维度来触发错误,但它很难看。C++20 中有更好的解决方案吗?

0 投票
3 回答
726 浏览

c++ - 如何在 constexpr 上下文中使用 if-constexpt 比较 string_view

是否可以在 constexpr 上下文中使用“if constexpr”比较 std::string_view?为什么 is_hello_2 和 is_hello_4 无法编译显示错误:“'s' is not a constant expression”

考虑到主要功能(https://godbolt.org/z/zEcnb8):

有没有办法修复“is_hello_2”和“is_hello_4”?

0 投票
0 回答
65 浏览

c++ - 如何在 if constexpr 逻辑中使用静态断言?

我想使用一些static_assert检查,条件取决于一些 constexpr 逻辑。我认为这样的事情可能会起作用:

因为在编译时应该可以确定只检查第一个断言。但是,我得到:

我有点惊讶,我会认为编译器足够聪明,可以在编译时理解第二个 if 不应该被采用。

所以我的问题是,知道如何获得执行这种“constexpr 条件静态断言”的模式吗?

关于我的编译器版本的一些信息,如果这可能有用:

PS:当然,这是一个微不足道/荒谬的测试,但我对如何获得这样的模式感兴趣,对于更复杂的情况。

0 投票
1 回答
402 浏览

c++ - How to match all string types with std::is_same_v

I'm trying to use templates to generify a method. However I'm struggling to match string types like string char * literals. See the following code example:

Test cases:

Output:

The surprising part to me is the Not matched! output since I passed a string literal directly into the method and it didn't match any of the cases.

1)Is there any constexpr check which matches all types of char *? Then I need another case for std::string objects so I can pass the .c_str() into the respective legacy method which expects char * as its argument.

2) Is there a way to statically fail the compilation if none of the cases are matched? (e.g. the else branch is taken). static_assert(false) in the else branch does not work since it will always take effect, regardless of the passed parameter type.

0 投票
0 回答
24 浏览

c++ - 如果不满足 constexpr 条件,则编译失败

我想使用模板C++函数匹配某些数据类型,如果没有constexpr匹配的情况,我想导致编译错误:

示例用法:

输出:

不匹配的数据类型情况是否可能导致编译错误,如果是,如何实现?static_assert不起作用,因为它总是生效,无论它放在代码中的什么位置(例如,取消注释上面的行总是会导致断言错误,无论上下文如何)。请注意,我不想抛出异常,而是完全阻止传递未处理的数据类型match_data_type()

0 投票
0 回答
35 浏览

c++ - 在 if constexpr 分支中产生编译器错误的惯用方法

我发现自己有这种类型的代码,

产生编译器错误而不是运行时错误的惯用方法是什么?(一个硬错误就可以了。)

我虽然这会工作,

但它使代码无条件地无法编译。

当然,我可以在条件之外添加,static_assert(std::is_same<T, double>{} or std::is_Same<T, float>但基本上我是在重复 if 语句中的条件。

0 投票
0 回答
56 浏览

c++ - 如果 constexpr 条件为假,如何避免编译此语句?

在模板中我可以这样做:

哪个工作正常。这就是为什么我为什么认为如果 constexpr 条件为假,编译器将不会尝试评估该语句。所以我希望这会起作用,但事实并非如此。我显然有错误的理解:

在第一个示例中,我可以编写将 T 传递给 cout 的运算符 << 的代码,即使它不接受 T,但是在此示例中,我无法传递 cout 运算符 << 可能接受或不接受的类型?

有人可以解释两者之间的区别吗?

0 投票
1 回答
94 浏览

c++ - 如何在 C++ 中通过 constexpr-if 跳过不可编译的代码?

想象下一个无法编译的代码:

在线尝试!

通过这段代码,我希望有几个不同类型的代码分支。一般来说,我想要不同的分支不仅适用于某些类型,而且适用于任何 constexpr 条件。

上面的代码是不可编译的,因为看起来编译器总是试图编译所有 if-constexpr 分支,即使它们有编译时错误条件。

当然,我可以通过使用模板结构专业化来解决上述任务,如下面的可编译代码:

在线尝试!

但是最后一个解决方案有几个缺点 - 1)它更罗嗦,需要更多的代码行。2)它需要全局定义代码结构,因为模板结构只能全局定义。3) 它需要所有需要的参数才能使代码工作以传递/转发给 operator() 调用。

constexpr 变体看起来更优雅,使用起来更直观。有没有办法用 if-constexpr 解决这样的任务?强制编译器不编译 compile-time-false-branch。

0 投票
4 回答
113 浏览

c++ - 如何在 constexpr if-else 链中导致静态错误?

在以下 C++20 函数模板中:

有什么我们可以写的东西在编译时???调用会失败吗?f<3>()

0 投票
3 回答
110 浏览

c++ - 为什么 min 仍然在 constexpr 中抱怨?

我有以下代码片段:

编译器正在解释

我认为这不会有问题,因为当 T 是双精度时,第一个分支不会被实例化。显然我的理解是错误的。有人可以帮助指出我的理解出错的地方吗?