在函数调用时重新分配默认参数
reassign default parameter on function call
我相信这个问题已经问过几百次了,但奇怪的是我找不到任何东西…我想知道如何在特定调用时为默认函数形参重新赋值,而省略它左边的其他形参。
不能编译,因为我是从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?我相信他们会把它标准化的,不管它是什么,你的余生都会被一些在雷德蒙德制造的侏儒监视。
- 为什么不接受具有默认分配参数的函数作为 0-arg 生成器?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 从不使用 C/C++ 默认值/分配给变量的值
- 为什么要在释放分配给该对象的内存之前调用该对象的默认析构函数?
- POD 类型是否可以具有显式声明的默认移动分配运算符
- 默认移动分配调用析构函数,复制分配不
- 使用Boost Spirit将默认值分配给变量
- 动态内存分配C++使用复制构造函数或默认构造函数
- 是否将std矢量重新分配到默认的构造函数向量是擦除的好方法
- 是隐式创建的默认构造函数,负责分配对象内存
- 将重载函数分配给功能指针作为默认值
- 带有默认构造函数加分配的Reinit变量
- Boost::序列化 - 如何序列化需要数据分配但没有默认构造函数的数据结构
- CRTP 和默认分配运算符
- 在解析分配给默认参数值的重载函数时,要考虑哪组函数
- 分配给匿名实例的基元类型的默认构造函数
- 如果我默认复制构造函数,将生成构造函数和移动分配
- 为什么在分配时调用默认构造函数的 STL 向量
- 分配默认值 std::function
- 在函数调用时重新分配默认参数