问题标签 [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++ - if constexpr 在内部伪造 static_assert 的最佳方法?
您可能知道 static_assert 不关心它是否在 if constexpr 的“活动”分支内(它总是“运行”)。
我有一个 hack 解决方法,它使用无效的数组维度来触发错误,但它很难看。C++20 中有更好的解决方案吗?
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”?
c++ - 如何在 if constexpr 逻辑中使用静态断言?
我想使用一些static_assert
检查,条件取决于一些 constexpr 逻辑。我认为这样的事情可能会起作用:
因为在编译时应该可以确定只检查第一个断言。但是,我得到:
我有点惊讶,我会认为编译器足够聪明,可以在编译时理解第二个 if 不应该被采用。
所以我的问题是,知道如何获得执行这种“constexpr 条件静态断言”的模式吗?
关于我的编译器版本的一些信息,如果这可能有用:
PS:当然,这是一个微不足道/荒谬的测试,但我对如何获得这样的模式感兴趣,对于更复杂的情况。
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.
c++ - 如果不满足 constexpr 条件,则编译失败
我想使用模板C++
函数匹配某些数据类型,如果没有constexpr
匹配的情况,我想导致编译错误:
示例用法:
输出:
不匹配的数据类型情况是否可能导致编译错误,如果是,如何实现?static_assert
不起作用,因为它总是生效,无论它放在代码中的什么位置(例如,取消注释上面的行总是会导致断言错误,无论上下文如何)。请注意,我不想抛出异常,而是完全阻止传递未处理的数据类型match_data_type()
。
c++ - 在 if constexpr 分支中产生编译器错误的惯用方法
我发现自己有这种类型的代码,
产生编译器错误而不是运行时错误的惯用方法是什么?(一个硬错误就可以了。)
我虽然这会工作,
但它使代码无条件地无法编译。
当然,我可以在条件之外添加,static_assert(std::is_same<T, double>{} or std::is_Same<T, float>
但基本上我是在重复 if 语句中的条件。
c++ - 如果 constexpr 条件为假,如何避免编译此语句?
在模板中我可以这样做:
哪个工作正常。这就是为什么我为什么认为如果 constexpr 条件为假,编译器将不会尝试评估该语句。所以我希望这会起作用,但事实并非如此。我显然有错误的理解:
在第一个示例中,我可以编写将 T 传递给 cout 的运算符 << 的代码,即使它不接受 T,但是在此示例中,我无法传递 cout 运算符 << 可能接受或不接受的类型?
有人可以解释两者之间的区别吗?
c++ - 如何在 C++ 中通过 constexpr-if 跳过不可编译的代码?
想象下一个无法编译的代码:
通过这段代码,我希望有几个不同类型的代码分支。一般来说,我想要不同的分支不仅适用于某些类型,而且适用于任何 constexpr 条件。
上面的代码是不可编译的,因为看起来编译器总是试图编译所有 if-constexpr 分支,即使它们有编译时错误条件。
当然,我可以通过使用模板结构专业化来解决上述任务,如下面的可编译代码:
但是最后一个解决方案有几个缺点 - 1)它更罗嗦,需要更多的代码行。2)它需要全局定义代码结构,因为模板结构只能全局定义。3) 它需要所有需要的参数才能使代码工作以传递/转发给 operator() 调用。
constexpr 变体看起来更优雅,使用起来更直观。有没有办法用 if-constexpr 解决这样的任务?强制编译器不编译 compile-time-false-branch。
c++ - 如何在 constexpr if-else 链中导致静态错误?
在以下 C++20 函数模板中:
有什么我们可以写的东西在编译时???
调用会失败吗?f<3>()
c++ - 为什么 min 仍然在 constexpr 中抱怨?
我有以下代码片段:
编译器正在解释
我认为这不会有问题,因为当 T 是双精度时,第一个分支不会被实例化。显然我的理解是错误的。有人可以帮助指出我的理解出错的地方吗?