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

c++ - if constexpr 和 C4702(以及 C4100 和 C4715)

有没有办法解决以下问题:

此代码生成 C4702 警告“无法访问的代码”(在 VC++ 15.8 上/std:c++17

为了抑制 C4100 '未引用的形式参数'警告,我已经在使用这个技巧

添加的简单想法

导致警告 C4715 '并非所有控制路径都返回一个值'。

0 投票
1 回答
8978 浏览

c++ - 我需要把 constexpr 放在 else-if 之后吗?

受此答案的启发,我尝试复制并粘贴(并在其中添加测试main())此代码:

这很简单——如果T推断为int,我们想要返回一个 的元组[a, 0.0]。如果T推导为double,我们要返回 的元组 [0, a]。否则,我们要返回[0, 0.0]

如您所见,在main()函数中,我foo使用const char*参数调用,这应该导致xandy0. 事实并非如此

在尝试编译它时,我遇到了一个奇怪的错误:

错误: 无法将 ' {0, a}' 从 ' <brace-enclosed initializer list>' 转换为 ' std::tuple<int, double>'

我就像什么?. 为什么我会想要那个...我专门用于当类型被推断为时才std::is_same启用。return {0, a} adouble

所以我迅速跑到if-constexpr 上的cppreference。在页面底部的Notes上方,我们可以看到这段代码:

我心想oookay..?我真的看不出原始代码有什么问题。它们使用相同的语法和语义......

但我很好奇。我很好奇(当时)是否有一些奇怪的东西可以解决这个问题,所以我将原始代码更改为:

瞧!代码按预期编译和执行。所以,我的问题是——在这种情况下,我们是否需要constexpr在每条if语句之后加上语句?if-else或者它只是我的编译器?我正在使用 GCC 7.3。

0 投票
4 回答
825 浏览

c++ - 三元运算符和 if constexpr

我有一些情况,有时bool我想调用 2 个constexpr返回不同类型的函数并将其分配给auto常量。

不幸的是,三元运算符需要类型“相似”。

我在下面的代码中有解决方法,但它非常冗长。有没有更好的办法?

0 投票
0 回答
88 浏览

c++ - 为什么在这种情况下“if constexpr”的行为不符合预期?

我的编译器是 Clang 7.0。

M2,我知道auto tmp = __VA_ARGS__;是非法的,因为decltype(__VA_ARGS__)void。但是,我使用过if constexpr,所以对我来说,编译器应该忽略非法分支。

这符合 C++17 吗?

0 投票
2 回答
412 浏览

c++ - 如果 constexpr 给出错误,则在 false 中实例化模板函数

考虑以下程序:

这可以编译并正常工作。但是,如果flag改为false,则 clang (Apple LLVM version 10.0.0 (clang-1000.10.44.4)) 给出编译器错误:

这是clang中的错误吗?

0 投票
3 回答
1819 浏览

c++ - 如果有 if-constexpr,怎么没有 switch-constexpr?

在 C++17if constexpr中引入;但是,似乎没有switch constexpr(请参见此处)。这是为什么?也就是说,如果编译器支持if constexpr,它是否支持也不是微不足道的switch constexpr(最坏的情况是 if-then-else-if-etc. 链,或者多个 if 带有一些标志来控制失败)?

0 投票
1 回答
1707 浏览

c++ - constexpr 运算符 new

是否可以将 operator new 重载为 constexpr 函数?就像是:

原因是在重载的运算符主体内执行 constexpr 函数,其中 count 参数值将是输入数据......因为运算符被调用:

数据类型的大小在编译时就知道了,不是吗?( count== sizeof(SomeClass)) 那么计数可以被认为是编译时间常数吗?

非常感谢任何愿意提供帮助的人!

0 投票
1 回答
614 浏览

c++ - “if constexpr”在模板之外有用吗?

我试图if constexpr完全理解。

我理解,如果if constexpr(expr)在模板中使用,并且expr依赖于模板参数,那么在实例化过程中,只有一个then/else分支将被实例化,另一个将被丢弃。

我有两个问题:

  • 是否真的,如果expr不依赖于模板参数,那么不会if constexpr(expr)丢弃任何分支?如果是,标准在哪里这样说?我看不出标准在哪里有例外,即丢弃仅在expr依赖时发生。
  • if constexpr在模板之外有用吗?如果是,这有什么用例?你能举一些例子来理解它的用处吗?
0 投票
2 回答
1469 浏览

c++ - constexpr 条件不恒定?

我编写了以下 C++17 代码:

然后我这样称呼它:

error: ‘pCondition’ is not a constant expressionif constexpr电话。

为什么?这不应该工作吗?

0 投票
2 回答
1553 浏览

c++ - if vs if constexpr inside constexpr 函数

最近我在我的 constexpr 函数中修改了一些if constexprif发现它们仍然可以正常工作,并且可以在编译时进行评估。这是一个最小的情况:

live demo

在上述情况下,N必须在编译时知道,因为它是非类型模板参数,所以if constexpr在这里可以正常工作。但是,它是一个 constexpr 函数,因此,iirc,即使我替换为:也可以获得返回if constexprif

live demo

cppref中,所有的要求A constexpr function must satisfy the following requirements:都没有提到ifif因此,IIUC,即使所有相关变量在编译时已知(is_negative如上),constexpr 函数是否包含在编译时评估也应该是实现定义的行为。

所以,我的结论是:

  • 在 c ++ 17 之前,我们没有if constexpr,所以选择是if
  • 在 c++17 之后,if constexpr如果我们希望 constexpr 函数在编译时得到评估,则首选。

以上是我的个人想法,可能有一些重要的遗漏/误解,请随时纠正我。问题仍然没有改变:ifand if constexpr,对于期望在编译时评估的 constexpr 函数,应该首选它。

参考: - constexpr 函数中允许什么? - “if constexpr()”与“if()”之间的区别