在函数调用时重新分配默认参数

reassign default parameter on function call

本文关键字:分配 默认 参数 函数调用 新分配      更新时间:2023-10-16

我相信这个问题已经问过几百次了,但奇怪的是我找不到任何东西…我想知道如何在特定调用时为默认函数形参重新赋值,而省略它左边的其他形参。

不能编译,因为我是从python中使用的。但是怎么做呢?

void test(int i=0, int j=1){
    std::cout << i << " " << j << std::endl;
}
int main()
{
    test(j=2);
}
<标题>编辑

好吧,这不可能。那么让我换个说法。为什么不可能?

现在,你的问题是为什么不允许,而不是是否允许。知道你来自Python,答案就更容易解释了。

在Python中,赋值是语句,而不是表达式。这意味着不能在函数调用中为变量赋值:

>>> def foo(bar):
...  return bar
... 
>>> x=0
>>> foo(x=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() got an unexpected keyword argument 'x'
同时,在c++中,赋值是一个表达式,而不是一个语句。因此,允许这样做:
void foo(int x) {
    // ...
}
void oof() {
    int x = 0;
    foo(x = 1);
}

在这种情况下,1被赋值给x, x的新值作为参数传递给foo()。所有这些混乱都来自一个叫Bjarne Stroustrup的人,他决定与另一个人的发明保持(一些)兼容性,这个人就是Dennis MacAlistair Ritchie。

现在,很明显可以理解为什么在c++中允许关键字参数会导致无法解析的堆栈溢出(但是编译器的堆栈溢出,而不是程序的堆栈溢出……)。程序如何区分上面描述的传统assign-and-return表达式和关键字参数?如果不修改语言,使其不再是C语言家族的一部分,这是根本不可能做到的。

这个混乱(在某种程度上)由Python不想与C/c++/C——/~C/!C/*C/&C/…但它确实想要允许关键字参数,因此另一个人,即Guido van Rossum,决定使用赋值语句,就像它们一直需要的那样。这使得上面c++中使用的语法可以在Python中用于关键字参数。

啊!而且,如果你有任何让c++更复杂的想法,为什么不去说你想到的第一个东西是ISO/ETC JTC1, SC22, WG21?我相信他们会把它标准化的,不管它是什么,你的余生都会被一些在雷德蒙德制造的侏儒监视。