2015-09-20 53 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

謝謝,這是我希望的那種解釋。 –