gpt4 book ai didi

c++ - "constexpr if"是否被视为 SFINAE?

转载 作者:行者123 更新时间:2023-12-04 11:02:43 25 4
gpt4 key购买 nike

constexpr if怎么样和 SFINAE有关的?
编译器在评估“constexpr if”表达式时是否使用 SFINAE?

我认为“constexpr if”正在使用 SFINAE。
它在条件 block 中替换,但在不能时不会出错。

另一方面,SFINAE 被定义为函数模板重载解析的规则,我想在评估“constexpr if”时您已经在函数中。

如果取决于函数的调用方式,编译器必须为 constexpr 的不同路径生成多个函数。所以也许它正在使用重载决议。

接受的提案没有提及“SFINAE”或“过载解决方案”。
所以我很好奇这两个概念是否适用于“constexpr if”。

最佳答案

SFINAE 的核心是:您编写的某些代码会触发 C++ 中的非法事物。但是因为您将该代码放在某个位置,所以它不会导致编译错误。它只会导致包含该代码的定义消失。因此,您可以使用条件测试,当为 true 时会产生合法的 C++ 语法,而当 false 时则不会(相对于 std::enable_if )。
if constexpr与 SFINAE 无关。 if constexpr只是评估一个常量表达式,然后执行一组语句或另一组。唯一的“SFINAE”-esque 部分是条件的未执行部分中的任何语句在模板中使用时实际上不存在(并且当不在模板中时,具有尽可能少的效果)。所以可以做这样的事情:

template<typename T>
void Foo()
{
if constexpr(!is_same_v<T, void>)
{
T t;
}
}
if 中的代码如果 T 语句将是非法的是 void .但是,由于存在使潜在非法代码消失的条件,因此调用 Foo<void> 是合法的。 .

Does the compiler employ SFINAE when evaluating "constexpr if" expressions?



它可以,但说真的,为什么会这样?它是编译器;它不必使用 enable_if体操或 C++ 模板奥术使语句消失。它只是评估一个常量表达式,并基于它使语句消失。

It's substituting in the conditional block, but not erroring out when it can't.



不,条件必须是合法的 C++ 常量表达式,无论其计算结果为真还是假。未执行的 block 中可能有非法语法。但条件本身必须始终是合法的。

关于c++ - "constexpr if"是否被视为 SFINAE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38259086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com