2014-04-30 2 views
1

Я пытаюсь передать std :: string в качестве аргумента по умолчанию функции.std :: string, разница между строкой val и строкой val = ""

Пытаюсь как следующий

void string_fun(int i, string val = "", int j = 10) 
// void string_fun(int i, string val, int j = 10) // <-- error since no default value 
{ 
    cout << "values " << endl; 
    cout << "i: " << i << endl; 
    cout << "val: " << val << endl; 
    cout << "j: " << j << endl; 
} 

void ret_fun() 
{ 
    string fun; 
    cout << "values " << endl; 
    cout << "fun: " << fun << endl; 
} 

int main() 
{ 
    string_fun(3); 
    ret_fun(); 
    return 0; 
} 

Я слышал, что конструктор по умолчанию строки будет инициализировать строку, если это правильно, что будет значением этого? См. Здесь, если я использую только string val в качестве аргумента функции, я получу ошибку компиляции. Но когда я печатаю строку как val, так и fun, я получаю тот же результат. Мой вопрос заключается в том, что делает две строки различными в случае их значений, так как string val = "" также создает пустую строку.

+1

Рассмотрите возможность использования 'string val = {}' вместо 'string val =" "'. Первый использует конструктор по умолчанию, тогда как последний использует неявный конструктор для создания строки из 'const char *'. Первый может быть более эффективным. В частности, он объявлен с _noexcept_. – nosid

ответ

3

Вы просматриваете список аргументов для функции, поэтому правила различны. Не имеет значения, что std::string имеет конструктор по умолчанию.

Дело в том, что правила языка для списков аргументов удостоверяют, что вы разрешаете или запрещаете вызывающему абоненту опускать параметры из вызова. Когда задано значение по умолчанию, вызывающий может опустить параметр, а вместо этого используются значения по умолчанию. Без значения по умолчанию вызывающий абонент должен указать соответствующий параметр.

Если вы не зададите значение по умолчанию второго параметра, ваш вызов

string_fun(3); 

не компилируется, как требуется, по крайней мере, два параметра. Вы даже можете использовать конструктор по умолчанию в вызове:

string_fun(3, string()); 
Смежные вопросы