问题标签 [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++ - 如果使用非模板类型,则为 Consexpr
此代码不能在 GCC 7 和 Clang 5 上编译:
由于引用的行位于应该评估为 的 constexpr if 分支中false
,所以程序不应该编译得很好吗?
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 的最终版本中修复。
c++ - for 语句中的 constexpr
c++17提供if constexpr
,其中:
条件的值必须是类型的上下文转换的常量表达式
bool
。如果值为true
,则丢弃 statement-false(如果存在),否则丢弃 statement-true
有没有办法在for
-statement 中使用它?在编译时展开循环?我希望能够做这样的事情:
c++ - 使用“if constexpr”和 SFINAE 禁用分支
我想在编译时启用/禁用分支,具体取决于是否可以使用某些参数调用函数。有什么if constexpr
条件?我可以通过 获取结果类型std::result_of(decltype(add)(A, B))
,但是如何检查结果类型是否有效?(即如何将此信息转换为bool
?)
c++ - 如果 constexpr 没有被丢弃,则在里面 static_assert
以下static_assert
应该被丢弃在 的 false 分支中if constexpr
,但由于断言失败而编译失败:
我希望丢弃的分支if constexpr
不会被评估,因为f
它是用 type 实例化的int
。
使用 Gcc 7.2 (-std=c++17) 编译
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 constexpr
withplacement new 的类似模式已经奏效。引用自cppref示例。
我想非放置版本有什么特别之处吗?
c++ - C++17 中的“如果 constexpr”在非模板函数中不起作用
我尝试使用 C++17 标准。我尝试使用 C++17 的功能之一if constexpr
。我有一个问题......请看下面的代码。这编译没有错误。在下面的代码中,我尝试使用if constexpr
它来检查它是否是一个指针。
但是当我重写上面的代码时,如下图,函数if constexpr
中的where是main
:
我得到一个编译错误:
问题不在主函数中。这可以是类似于以下的任何函数。
我想知道为什么if constexpr
只在模板函数中有效,即使类型是由输入参数中的 decltype 推导出来的。
c++ - constexpr 静态成员何时停止成为 constexpr?
我有这个片段。
我的问题是:不应该c.f();
同时f2(JustStr("yes"));
失败或成功吗?为什么一个失败,另一个为什么成功?
c++ - if constexpr 在递归通用 lambda 中:不同的编译器行为
以下代码使用g++ 7.3.0编译成功,而使用clang++ 6.0.0编译失败(编译标志为-std=c++17 -Wall -Wextra -Werror -pedantic-errors
):
clang++编译错误信息:
错误:用推导类型 'auto' 声明的变量 'foo' 不能出现在它自己的初始化程序中
在这种情况下,什么行为符合标准?