"constexpr if" 是否被视为 SFINAE?

Is "constexpr if" considered SFINAE?

constexpr if and SFINAE 有什么关系?
编译器在评估 "constexpr if" 表达式时是否使用 SFINAE?

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

另一方面,SFINAE 被定义为 函数模板 重载解析的规则,我想当 "constexpr if" 正在处理时你已经在函数中了评估。

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

已接受的提案未提及 "SFINAE" 或 "overload resolution"。
所以我很好奇这两个概念是否适用于 "constexpr if"。

SFINAE,其核心是:你写了某些代码,在 C++ 中触发了一个非法的东西。但是因为你把那段代码放在某个地方,它不会导致编译错误。它只会导致包含该代码的定义消失。因此,您可以使用条件测试,当为真时会产生合法的 C++ 语法,而当为假时则不会(相对于 std::enable_if)。

if constexpr与SFINAE无关。 if constexpr 只是评估常量表达式,然后执行一组语句或另一组语句。唯一的 "SFINAE"-esque 部分是条件的未执行部分中的任何语句在模板中使用时实际上不存在(并且当不在模板中时,效果尽可能少) .所以可以这样做:

template<typename T>
void Foo()
{
    if constexpr(!is_same_v<T, void>)
    {
        T t;
    }
}

如果 Tvoidif 语句中的代码将是非法的。但是,因为存在使潜在非法代码消失的条件,所以调用 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++ 常量表达式,无论它的计算结果为 true 还是 false。未执行的块中可能包含非法语法。但条件本身必须始终合法。