【问题标题】:Wrong understanding of 'if constexpr'对“if constexpr”的错误理解
【发布时间】:2019-10-09 09:12:41
【问题描述】:

我有以下代码

static constexpr bool condition = true;

int square(int num) {
    if constexpr (condition) {
      return num * num;
    } else {
      x
      return num;
    }
}

int main() {
    return square(3);
}

编译

-std=gnu++17

我的假设

if constexpr (condition)

是在编译过程中

    } else {
      x
      return num;
    }

被丢弃,我没有得到关于未定义的错误

x

我的理解是错误的,这个'if constexpr'类似于

#ifdef CONDITION
  return num * num;
#else
  x
  return num;
#endif

如何修改这段代码才能编译它?

感谢您的帮助

【问题讨论】:

    标签: c++ c++17 if-constexpr


    【解决方案1】:

    如何修改这段代码才能编译它?

    要修复您的代码,只需删除带有x 的行。

    我的理解是错误的,这个“if constexpr”类似于 [...]

    是的,你的理解是错误的。来自cppreference

    在模板之外,完全检查丢弃的语句。 if constexpr 不能替代 #if 预处理指令。

    这意味着if constexpr 块中的每个分支都必须是有效的 C++,即使它永远不会被使用。

    【讨论】:

    • 说它必须在语法上正确但它允许在语义上不正确是否正确?
    • 不确定。您在这里混合了两件事-“语法正确”是可以以客观,严格的方式进行评估的东西。某件事是否“语义正确”取决于您对问题域的理解、您使用的 API 等,因此这部分内容相当模糊。
    • 所以我可能误用了这些术语。我指的是未采用的分支也可以是不可编译的,只要它是有效的 C++。所以在某种程度上它必须在某个级别上是“有效的”,尽管它在另一个级别上可能是无效的。我猜这两个级别是什么。我问这两个层次是语法和语义,你说没有,那它们有名字吗?
    • 我已经问过a new question,如果你有兴趣。
    【解决方案2】:

    正如您所观察到的,您不能在 if constexpr 子句中包含类似 x 代码行的“垃圾代码”。

    使用if constexpr 而不是#if 的主要优点是if constexpr 能够以预处理器无法做到的方式推理类型。这种优势通常在模板中得到利用。

    例如,您可以执行以下操作:

    template <typename T>
    T squareOnlyInt(T num) {
        if constexpr (std::is_same<T,int>::value) {
          return num * num;
        }
        else {
          return num;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2018-04-10
      • 2017-09-12
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多