为什么C++中的函数没有constexpr参数



写这样的东西会很方便也很好:

void f(double a, int constexpr b, bool c) {}

即在一个正则(运行时,nonconstexpr(函数中混合非constexpr和constexpr参数。同样,这样的函数的调用将像f(a, 123, b)一样干净简单,而不会难以读取模板参数。

上面的函数应该表现得(并在下面的编译器中实现(,就好像它只是一个常规的模板函数(具有不同的参数顺序(:

template <int b>
void f(double a, bool c) {}

上面的这个template变体可以代替第一个变体,但第一个变体作为第二个变体的语法糖仍然很好。

例如,最新的C++已经有了一个很好的语法糖,可以将params和返回值都作为auto(与lambdas中的相同(:

auto f(int x, auto y) { return y; }

当然,有人可能会问,为什么不把所有的params都作为运行时params,就像下面的函数一样,无论如何,编译器通常会内联所有内容:

void f(double a, int b, bool c) {}

但是,所有参数的这种运行时传递并不总是保证内联和/或其他编译时常量优化。此外,它不允许在constexpr上下文中使用变量b,例如在if constexpr()中。

我的问题是,为什么C++仍然没有在函数的参数中混合constexpr和nonconstexpr参数这样的特性?此外,也许还有关于这方面的建议或未来计划?

似乎有一些标准化工作,但我认为重复的功能几乎没有用处。只需将constexpr参数作为模板参数传递即可。您的版本将如何与函数指针交互?你是否也建议int constexpr应该是一种不同的类型?还是您建议模板化版本应该使用更好的语法?是否编译:

void foo(int constexpr);
void (*fp)(int) = foo;

如果你能很好地将这个想法融入C++类型的系统中,并且你觉得这个收获值得标准化的努力,那么看看如何提交建议书。

最新更新