2015-09-20 74 views
-1

我敢肯定,这已被问过几百次之前,但很奇怪,我找不到任何东西......我不知道我可以重新分配一个值到一个默认的函数参数,省略其左侧的其他参数。重新分配函数调用默认参数

这不会编译,因为我从python中使用。但怎么做呢?

void test(int i=0, int j=1){ 

    std::cout << i << " " << j << std::endl; 

} 

int main() 
{ 

    test(j=2); 

} 

编辑

好吧,这是不可能的。那么让我重新解释一下我的问题。为什么不可能?

+2

你根本不能。 –

+0

哦。你能解释为什么吗? –

+1

因为他们没有这样设计语言。 – TheUndeadFish

回答

1

现在,你的问题是为什么这是不允许的,而不是如果它允许。知道你来自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/C/C/C/C/C/O兼容,但它确实需要以允许关键字参数,因此,另一个人,即Guido van Rossum,决定作出他们一直需要的作业陈述。这允许上面在C++中使用的语法在Python中可用于关键字参数。

啊!而且,如果你有任何想法让C++变得更加复杂,为什么不去谈论你想到的第一件事ISO/ETC JTC1, SC22, WG21?我相信他们会将它标准化,不管它是什么,并且你会在some gnomes fabricated in Redmond之后被追踪。

+0

谢谢,这是我希望的那种解释。 –