是" constexpr如果"考虑SFINAE?

时间:2016-07-08 04:51:30

标签: templates constexpr sfinae overload-resolution c++17

constexpr ifSFINAE如何相关? 在评估" constexpr时编译器是否使用SFINAE"表情?

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

另一方面,SFINAE被定义为功能模板的重载分辨率的规则,并且我认为你已经在" constexpr中已经处于一个函数中。正在评估中。

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

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

1 个答案:

答案 0 :(得分:10)

SFINAE,其核心是:您编写某些代码,在C ++中触发非法内容。但是因为你把代码放在某个地方,它不会导致编译错误。它只会导致包含该代码的定义消失。因此,您可以使用条件测试,当真实导致合法的C ++语法时,如果不是,则不使用{vis-a-vis std::enable_if)。

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

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

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

  

编译器在评估&#34; constexpr时是否使用SFINAE&#34;表情?

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

  

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

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