问题标签 [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 和 C4702(以及 C4100 和 C4715)
有没有办法解决以下问题:
此代码生成 C4702 警告“无法访问的代码”(在 VC++ 15.8 上/std:c++17
)
为了抑制 C4100 '未引用的形式参数'警告,我已经在使用这个技巧
添加的简单想法
导致警告 C4715 '并非所有控制路径都返回一个值'。
c++ - 我需要把 constexpr 放在 else-if 之后吗?
受此答案的启发,我尝试复制并粘贴(并在其中添加测试main()
)此代码:
这很简单——如果T
推断为int
,我们想要返回一个 的元组[a, 0.0]
。如果T
推导为double
,我们要返回 的元组 [0, a]
。否则,我们要返回[0, 0.0]
。
如您所见,在main()
函数中,我foo
使用const char*
参数调用,这应该导致x
andy
是0
. 事实并非如此。
在尝试编译它时,我遇到了一个奇怪的错误:
错误: 无法将 '
{0, a}
' 从 '<brace-enclosed initializer list>
' 转换为 'std::tuple<int, double>
'
我就像什么?. 为什么我会想要那个...我专门用于仅当类型被推断为时才std::is_same
启用。return {0, a}
a
double
所以我迅速跑到if-constexpr 上的cppreference。在页面底部的Notes上方,我们可以看到这段代码:
我心想oookay..?我真的看不出原始代码有什么问题。它们使用相同的语法和语义......
但我很好奇。我很好奇(当时)是否有一些奇怪的东西可以解决这个问题,所以我将原始代码更改为:
瞧!代码按预期编译和执行。所以,我的问题是——在这种情况下,我们是否需要constexpr
在每条if
语句之后加上语句?if-else
或者它只是我的编译器?我正在使用 GCC 7.3。
c++ - 三元运算符和 if constexpr
我有一些情况,有时bool
我想调用 2 个constexpr
返回不同类型的函数并将其分配给auto
常量。
不幸的是,三元运算符需要类型“相似”。
我在下面的代码中有解决方法,但它非常冗长。有没有更好的办法?
c++ - 为什么在这种情况下“if constexpr”的行为不符合预期?
我的编译器是 Clang 7.0。
在M2
,我知道auto tmp = __VA_ARGS__;
是非法的,因为decltype(__VA_ARGS__)
是void
。但是,我使用过if constexpr
,所以对我来说,编译器应该忽略非法分支。
这符合 C++17 吗?
c++ - 如果 constexpr 给出错误,则在 false 中实例化模板函数
考虑以下程序:
这可以编译并正常工作。但是,如果flag
改为false
,则 clang (Apple LLVM version 10.0.0 (clang-1000.10.44.4)) 给出编译器错误:
这是clang中的错误吗?
c++ - 如果有 if-constexpr,怎么没有 switch-constexpr?
在 C++17if constexpr
中引入;但是,似乎没有switch constexpr
(请参见此处)。这是为什么?也就是说,如果编译器支持if constexpr
,它是否支持也不是微不足道的switch constexpr
(最坏的情况是 if-then-else-if-etc. 链,或者多个 if 带有一些标志来控制失败)?
c++ - constexpr 运算符 new
是否可以将 operator new 重载为 constexpr 函数?就像是:
原因是在重载的运算符主体内执行 constexpr 函数,其中 count 参数值将是输入数据......因为运算符被调用:
数据类型的大小在编译时就知道了,不是吗?( count== sizeof(SomeClass)
) 那么计数可以被认为是编译时间常数吗?
非常感谢任何愿意提供帮助的人!
c++ - “if constexpr”在模板之外有用吗?
我试图if constexpr
完全理解。
我理解,如果if constexpr(expr)
在模板中使用,并且expr
依赖于模板参数,那么在实例化过程中,只有一个then
/else
分支将被实例化,另一个将被丢弃。
我有两个问题:
- 是否真的,如果
expr
不依赖于模板参数,那么不会if constexpr(expr)
丢弃任何分支?如果是,标准在哪里这样说?我看不出标准在哪里有例外,即丢弃仅在expr
依赖时发生。 if constexpr
在模板之外有用吗?如果是,这有什么用例?你能举一些例子来理解它的用处吗?
c++ - constexpr 条件不恒定?
我编写了以下 C++17 代码:
然后我这样称呼它:
我error: ‘pCondition’ is not a constant expression
接if constexpr
电话。
为什么?这不应该工作吗?
c++ - if vs if constexpr inside constexpr 函数
最近我在我的 constexpr 函数中修改了一些if constexpr
,if
发现它们仍然可以正常工作,并且可以在编译时进行评估。这是一个最小的情况:
在上述情况下,N
必须在编译时知道,因为它是非类型模板参数,所以if constexpr
在这里可以正常工作。但是,它是一个 constexpr 函数,因此,iirc,即使我替换为:也可以获得返回值:if constexpr
if
从cppref中,所有的要求A constexpr function must satisfy the following requirements:
都没有提到if
。if
因此,IIUC,即使所有相关变量在编译时已知(is_negative
如上),constexpr 函数是否包含在编译时评估也应该是实现定义的行为。
所以,我的结论是:
- 在 c ++ 17 之前,我们没有
if constexpr
,所以选择是if
- 在 c++17 之后,
if constexpr
如果我们希望 constexpr 函数在编译时得到评估,则首选。
以上是我的个人想法,可能有一些重要的遗漏/误解,请随时纠正我。问题仍然没有改变:if
and if constexpr
,对于期望在编译时评估的 constexpr 函数,应该首选它。