当前位置: 首页 > 知识库问答 >
问题:

“Constexpr If”是否被认为是sfinae?

邵正雅
2023-03-14

编译器必须为constexpr的不同路径生成多个函数,这取决于函数的调用方式。所以也许它在使用过载分辨率。

被接受的建议没有提到“sfinae”或“过载分辨率”。
所以我很好奇这两个概念是否适用于“constexpr if”。

共有1个答案

姚烨
2023-03-14

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

如果constexpr与sfinae无关。如果constexpr只是计算一个常量表达式,则执行一组语句或另一组语句。唯一类似于“sfinae”的部分是,在模板中使用时,条件的未执行部分中的任何语句实际上都不存在(如果不在模板中,则尽可能少地产生影响)。所以可以这样做:

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

如果tvoidif语句中的代码将是非法的。但是,由于存在使潜在非法代码消失的条件,因此调用foo 是合法的。

编译器在计算“constexpr if”表达式时是否使用SFINAE?

可以,但说真的,为什么会呢?它是编译器;它不必使用enable_if体操或C++模板arcana来使语句消失。它只是计算一个常量表达式,并在此基础上删除语句。

它在条件块中进行替换,但不能替换时不会出错。

 类似资料:
  • 然而,我不确定我是否理解他的观点,因为根据我的理解,当我们有一个父类引用变量指向子类对象时,一个行为被认为是多态的(侧重于动态多态性)。 然后在运行时获取父类变量所指向的实际对象,并调用其方法,如这里所解释的那样。 但是,我没有在我的项目中使用上向转换(即用对象类变量初始化POJO类)。 因此,我的问题是--尽管父类(对象)从未用作引用变量,但重写toString()是否被视为多态性? 我在Sta

  • 首先让我说,“记录器”是指任何一类负责向用户或程序员报告诊断或进度信息的对象。根据这个定义,“记录器”将包括图形用户界面上的反馈,如进度条。 我们一再被告知要避免全局状态,尤其是全局可变状态(GMS)。因为伐木者天生是可变的,所以我最近试图让我的伐木者“不是全球性的”。我尝试了各种策略(比如通过构造函数向记录器注入引用)。我终于意识到,所有的方法都是把口红贴在猪身上。 日志记录器必须是所有类(或至

  • 问题内容: 在我的一个项目中,我有两个“数据传输对象” RecordType1和RecordType2,它们从RecordType的抽象类继承。 我希望两个RecordType对象在“ process”方法中由相同的RecordProcessor类处理。我的第一个想法是创建一个通用的处理方法,该方法将两个特定的处理方法委托给以下人员: 我读过Scott Meyers在 Effective C ++

  • 问题内容: 我正在开发一个网页,在那里我为类似国际象棋的游戏布置一块面板,以及几个棋盘托盘。所有操作都使用HTML(使用jQuery在游戏进行时进行动态更新)完成。在某个地方,我想到在页面中使用元素的绝对定位被认为是不好的做法,并且最好使用相对定位。 经过相对定位的困扰了很长时间之后,我意识到板元件的绝对定位要容易得多,而且要正确得多。 有谁知道相对定位优于绝对定位的原因吗?在决定采用哪种方法时,

  • 问题内容: 我们正在将两个系统集成到一个Intranet中,使用CORS作为在两个域之间进行AJAX调用的一种方式。 这被认为是不良做法吗?一般认为CORS是不良做法吗? 问题答案: CORS不是坏习惯。它支持所有主要的浏览器,而且越来越多的API都支持它。实际上,如果您的公共资源不在防火墙后面,则可以将标头放在资源上是安全的。 但是,对于服务器上CORS的角色有些困惑。CORS应该仅指示特定资源

  • 问题内容: 如果我理解正确 给出与以下结果相同的结果 所以我想它更优雅。 我似乎还记得在JavaScript代码中看到过这种短路分配语句。但是在Python中在赋值语句中使用短路是否被认为是好的样式? 问题答案: 这确实是一个意见问题,但在大多数情况下,答案是否定的。它与多种样式指南背道而驰,可能是因为人们倾向于认为它的意思是“如果a为真,则使用b的值,否则使用c的值”,而不是您发布的实际含义。