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

c++ - 如果使用非模板类型,则为 Consexpr

此代码不能在 GCC 7 和 Clang 5 上编译:

由于引用的行位于应该评估为 的 constexpr if 分支中false,所以程序不应该编译得很好吗?

0 投票
1 回答
478 浏览

c++ - if constexpr - clang 与 GCC 中的非 constexpr 变量

clang 6 接受代码,GCC 8 拒绝它:

谁是正确的,为什么?

当我按引用获取参数时,两者都拒绝代码:

用clang 6编译:

当我将参数复制到局部变量中时,都接受代码:

编辑:我确信两个编译器都会正确处理第二种和第三种情况。不过,我不知道规则是什么。

在第一种情况下,我怀疑 clang 是正确的,因为这种情况类似于第二种情况。我想知道在第一种情况下 clang 或 GCC 是否正确,在第二种情况下哪些规则使非 constexpr 变量的使用v无效,在第三种情况下x有效。

编辑2:第一个问题现在很清楚: https ://gcc.gnu.org/bugzilla/show_bug.cgi?id=84421

clang 是对的,GCC 7 也接受了代码。该错误将在 GCC 8 的最终版本中修复。

0 投票
3 回答
4683 浏览

c++ - for 语句中的 constexpr

提供if constexpr,其中:

条件的值必须是类型的上下文转换的常量表达式bool。如果值为true,则丢弃 statement-false(如果存在),否则丢弃 statement-true

有没有办法在for-statement 中使用它?在编译时展开循环?我希望能够做这样的事情:

0 投票
2 回答
713 浏览

c++ - 使用“if constexpr”和 SFINAE 禁用分支

我想在编译时启用/禁用分支,具体取决于是否可以使用某些参数调用函数。有什么if constexpr条件?我可以通过 获取结果类型std::result_of(decltype(add)(A, B)),但是如何检查结果类型是否有效?(即如何将此信息转换为bool?)

0 投票
0 回答
2134 浏览

c++ - 如果 constexpr 没有被丢弃,则在里面 static_assert

以下static_assert应该被丢弃在 的 false 分支中if constexpr,但由于断言失败而编译失败:

我希望丢弃的分支if constexpr不会被评估,因为f它是用 type 实例化的int

使用 Gcc 7.2 (-std=c++17) 编译

0 投票
2 回答
126 浏览

c++ - `if constexpr` 的问题与非放置 new

我正在尝试编写一个实用程序来调用new T{...}new T(...)基于是否T是聚合类型。到目前为止,我所达到的内容如下。请注意,由于这个问题,我使用的是宏而不是函数模板。

我试图在 gcc 7.2.0 上测试它

然后发生以下错误(live)。

编译器谈到了p = new T(__VA_ARGS__);. ::std::is_aggregate_v<T>但是当它是真的时,不应该根本不考虑吗?

请注意,使用if constexprwithplacement new 的类似模式已经奏效。引用自cppref示例。

我想非放置版本有什么特别之处吗?

0 投票
4 回答
3529 浏览

c++ - C++17 中的“如果 constexpr”在非模板函数中不起作用

我尝试使用 C++17 标准。我尝试使用 C++17 的功能之一if constexpr。我有一个问题......请看下面的代码。这编译没有错误。在下面的代码中,我尝试使用if constexpr它来检查它是否是一个指针。

但是当我重写上面的代码时,如下图,函数if constexpr中的where是main

我得到一个编译错误:

问题不在主函数中。这可以是类似于以下的任何函数。

我想知道为什么if constexpr只在模板函数中有效,即使类型是由输入参数中的 decltype 推导出来的。

0 投票
1 回答
76 浏览

c++ - constexpr 静态成员何时停止成为 constexpr?

我有这个片段。

我的问题是:不应该c.f();同时f2(JustStr("yes"));失败或成功吗?为什么一个失败,另一个为什么成功?

0 投票
1 回答
320 浏览

c++ - if constexpr 在递归通用 lambda 中:不同的编译器行为

以下代码使用g++ 7.3.0编译成功,而使用clang++ 6.0.0编译失败(编译标志为-std=c++17 -Wall -Wextra -Werror -pedantic-errors):

clang++编译错误信息:

错误:用推导类型 'auto' 声明的变量 'foo' 不能出现在它自己的初始化程序中

在这种情况下,什么行为符合标准?

0 投票
1 回答
494 浏览

c++ - 如果 constexpr 在 lambda 内,则编译器行为不同

考虑以下代码。如果我的理解if constexpr是正确的,则else不应编译该分支,因此z()不应将其视为错误。

clanggcc中编译;但对于最新的 MSVC,它不会。不幸的是,goldbolt 的 MSVC 太旧了,但在我的机器上完全更新了 VS 2017,cl /std:c++17产生:

如果移除了封闭的 lambda,则代码将在所有三个编译器上编译。

我做错了什么或不受支持,还是只是一个 MSVC 错误?