2015-09-20 2 views
-1

Я уверен, что это было задано сотни раз раньше, но с любопытством я ничего не могу найти ... Интересно, как я могу переназначить значение для параметра функции по умолчанию при вызове, опуская другие параметры, которые стоят слева от него.переназначить параметр по умолчанию при вызове функции

Это не скомпилируется, поскольку я был использован из python. Но как это сделать?

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

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

} 

int main() 
{ 

    test(j=2); 

} 

Редактировать

Хорошо, это не возможно. Позвольте мне перефразировать мой вопрос. ПОЧЕМУ это невозможно?

+2

Вы просто не можете. –

+0

oh. можете ли вы объяснить, почему? –

+1

Потому что они не разработали язык таким образом. – TheUndeadFish

ответ

1

Теперь ваш вопрос: почему не разрешено, а не is разрешено. Зная, что вы пришли из 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? Я уверен, что они оценят его, что бы это ни было, и вы останетесь на всю оставшуюся жизнь на some gnomes fabricated in Redmond.

+0

Спасибо, вот какое объяснение я надеялся. –

Смежные вопросы