2014-01-28 3 views
9

Это вопрос новичков, но я не могу понять, как это работает.Передача const char вместо std :: string как аргумент функции

Пусть у меня есть функция, как один ниже

void foo(const std::string& v) { 
    cout << v << endl; 
} 

И ниже вызов в моей программе.

foo("hi!"); 

По существу Я передаю const char* к функции аргумента, константная ссылка на строку, поэтому у меня есть сомнения на этом призыве.

Чтобы передать аргумент по ссылке, могу ли я сказать, что переменная должна существовать, по крайней мере, в течение всего времени вызова? Если это так, где создается строка, которая передается функции?

Я вижу, что он работает: это происходит, потому что компилятор создает временный string, который передается аргументу или функции?

+2

Вы правы в своих предположениях, он создает временную 'std :: string'. Другим подходом может быть использование 'string_view/string_ref', который может содержать как' const char * ', так и' std :: string' без создания копии (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n3849.html или http://www.boost.org/doc/libs/1_55_0/libs/utility/doc/html/string_ref.html) – dalle

ответ

17

Это происходит потому, что компилятор создает временную строку, переданную аргументу или функции?

Да, и временным лицам разрешено связывать const ссылки lvalue. Временная строка v жива на время вызова функции.

Обратите внимание, что это возможно, потому что std::string имеет неявный конструктор преобразования с параметром const char*. Это тот же самый конструктор, который делает это возможным:

std::string s = "foo"; 
+3

и работает, потому что конструктор не объявлен как явный. – CashCow

+0

Привет juanchopanza. Большое спасибо за объяснение. –

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