有没有理由只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中."我不配",提出的是不是一个借口:这是工作需要做,而不是被一些真棒授予福音.通过做这项工作,一个人变得很棒."我很懒"是一个借口,一个我非常熟悉的借口.
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.现在,它可能是值得的.但有人必须投入努力.