如果有一个constexpr if语句,为什么不是其他constexpr语句呢?

Ste*_*Fan 15 c++ c++17

有没有理由只if constexpr被包含在C++ 17中?

我能做到这一点:

template <int N>
constexpr int fib() {
    if constexpr (N == 1 || N == 2) {
        return 1;
    } else {
        return fib<N - 1>() + fib<N - 2>();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么不考虑C++委员会switch constexpr

template <int N>
constexpr int fib() {
    switch constexpr (N) {
        case 1:
        case 2: return 1;
        default: return fib<N - 1>() + fib<N - 2>();
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来好多了 switch constexpr

甚至是一个过早的编译时循环,使用for constexpr/ while constexpr不使用模板替换/递归模板函数展开:

constexpr void printFoo() {
    for constexpr (auto i = 0; i < 10; i++) {
        cout << fib<i>() << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

它们是否会包含在C++ 20 /未来版本的C++中?

Yak*_*ont 28

if constexpr 被提议相对接近于最终确定的C++ 17.

装饰(如switch)可能推迟了它的包含.

像强制循环展开这样的花哨肯定会有.

改变C++标准需要真正的工作.你必须自己在编译器中实现它作为证明它可以完成,说服其他编译器编写者应该是容易或值得努力,弄清楚它应该在标准中措辞明确和明确,说服其他成员委员会认为你的改变不仅仅是语言等等.

它不需要有理由发生.事情不会一直发生.C++改进不是一些自然过程,除非有人阻止它,

Tl;博士:因为你没有提出它并通过标准化来实现它.立即开始,可能是在C++ 20中."我不配",提出的是不是一个借口:这是工作需要做,而不是被一些真棒授予福音.通过做这项工作,一个人变得很棒."我很懒"是一个借口,一个我非常熟悉的借口.

  • 您必须在编译器中实现它并不是一个正式的要求.没有那么多正式要求,而且这些要求大多是程序性的.但它肯定有助于说服WG21.在这种情况下,它是语法糖.WG21的主要关注点不是它是否可以实现,而是语义是否定义明确并且与语言的其他部分没有冲突. (4认同)

Bri*_*ian 13

一般来说,C++标准委员会不会因为"看起来很酷"而添加新功能.每个新功能仅在提交论文后才添加,该论文提出了精心制作的法律术语,精确指定了该功能的语法和语义,这些功能通常会经过多次修订,因为所有这些影响都是由专家提出的.

这为添加新功能提供了一个天然的障碍:如果它添加到语言中的功能不足以使这种艰苦的体验变得有价值,那么没有人愿意正式提出它.

if constexpr 是语言的一个有价值的补充(尝试重写代码不使用它,你会明白为什么)并且指定并不复杂:如果条件为真,则丢弃第二个子语句,否则丢弃第一个子语句.

相反,switch constexpr由于switch陈述的复杂性较大,会在措辞上造成更大的困难.(不过,欢迎您尝试.)例如,您对这应该如何工作有一个自然的期望:

switch constexpr (x) {
  case 1:
    bar<x>();
    if constexpr(y) { break; }
  case 2:
    baz<x>();
}
Run Code Online (Sandbox Code Playgroud)

即if x为1且y为true则baz<x>则不实例化,但如果x为1且y为false则baz<x> 实例化.如果你想要这些语义,你需要弄清楚标准,它必须指定一个有效的程序来确定要丢弃哪些语句(请记住,这些ifs和switches可以任意嵌套).如果你不想要这些语义,你switch constexpr可能不会比一堆语言强大if constexpr,但与普通switch语句相比会有限制.

这些困难进一步加剧for constexpr.现在,它可能是值得的.但有人必须投入努力.

  • 最初的论文可能会建立一个从`switch constexpr`到等效但更详细的`if constexpr`语句的转换.首先测试WG21水域,看看是否有足够的兴趣.如果有好的反馈,那么第二篇论文就可以提出实际的标准. (2认同)