constexpr if和SFINAE如何相关? 在评估" constexpr时编译器是否使用SFINAE"表情?
我认为" constexpr如果" 使用SFINAE 它在条件块中替换,但在它不可能时不会错误。
另一方面,SFINAE被定义为功能模板的重载分辨率的规则,并且我认为你已经在" constexpr中已经处于一个函数中。正在评估中。
如果取决于函数的调用方式,编译器必须为constexpr的不同路径生成多个函数。所以也许它使用重载解析。
接受的提案没有提及" SFINAE"或者"重载决议"。
所以我很好奇这两个概念是否适用于" constexpr if"。
答案 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;
}
}
如果if
为T
,void
声明中的代码将是非法的。但是,由于条件是使潜在的非法代码消失,因此调用Foo<void>
是合法的。
编译器在评估&#34; constexpr时是否使用SFINAE&#34;表情?
它可以,但严重的是,为什么会这样?它是编译器;它不必使用enable_if
体操或C ++模板arcana来使语句消失。它只是评估一个常量表达式,并根据它使语句消失。
它在条件块中替换,但在它不可能的情况下不会出错。
不,条件必须是合法的C ++常量表达式,无论它的计算结果为true还是false。未执行的块可能包含非法语法。但条件本身必须始终合法。