"constexpr if"是否被认为是SFINAE?

Tre*_*key 7 templates sfinae overload-resolution constexpr c++17

如何constexpr如果SFINAE有关?
在评估"constexpr if"表达式时,编译器是否使用SFINAE?

我认为"constexpr if" 正在使用SFINAE.
它在条件块中替换,但在不能的情况下不会出错.

另一方面,SFINAE被定义为函数模板的重载解析规则,并且我认为在评估"constexpr if"时您已经处于函数中.

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

被接受的提案没有提到"SFINAE"或"重载决议".
所以我很好奇这两个概念是否适用于"constexpr if".

Nic*_*las 10

SFINAE的核心是这样的:你编写的某些代码在C++中触发了非法的东西.但是因为您将该代码放在某个位置,所以它不会导致编译错误.它只会导致包含该代码的定义消失.因此,您可以使用条件测试,当真正导致合法的C++语法时,以及当错误时不会(vis-a-vis std::enable_if).

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

template<typename T>
void Foo()
{
    if constexpr(!is_same_v<T, void>)
    {
        T t;
    }
}
Run Code Online (Sandbox Code Playgroud)

if如果T是的话,声明中的代码将是非法的void.但是,由于条件是使潜在的非法代码消失,因此调用是合法的Foo<void>.

在评估"constexpr if"表达式时,编译器是否使用SFINAE?

它可以,但严重的是,为什么会这样呢?这是编译器 ; 它不必使用enable_if体操或C++模板arcana来使语句消失.它只是评估一个常量表达式,并根据它使语句消失.

它在条件块中替换,但在不能的情况下不会出错.

不,条件必须是合法的C++常量表达式,无论它的计算结果为true还是false.未执行的块可能包含非法语法.但条件本身必须始终合法.

  • @EuriPinhollow:没有名字,因为他们以不同的方式做了两件不同的事情.它们的相似之处在于它们基于某种条件语句丢弃代码.您可以将其称为条件编译,但即使这并不完全表明它的范围. (2认同)