C++: передача строкового литерала типа const char* в строковый параметр

я новичок в С++ и не понимаю, почему этот код работает хорошо:

string GetString(string promt)
{
    cout << promt << ": ";
    string temp;
    getline(cin, temp); 
    return temp; 
}

int main()
{
    string firstName = GetString("Enter your first name"); 
    string lastName = GetString("Enter your last name");

    cout<< "Your Name is: " << firstName << " " << lastName; 


    cin.ignore(); 
    cin.get(); 

    return 0;
}

Строковые литералы типа "bla" имеют тип const char*. По крайней мере, auto i = "bla"; указывает, что i имеет тип "const char*". Почему его можно передать в GetString-Function, ведь функция ожидает строку, а не const char*?


person Grundkurs    schedule 30.08.2012    source источник
comment
Строковые литералы имеют тип const char(&)[N], но поскольку C не может скопировать массив в локальную переменную, auto все равно делает локальную переменную const char*.   -  person Mooing Duck    schedule 30.08.2012


Ответы (2)


std::string имеет преобразующий конструктор, который принимает char const* и инициализирует строку с Строка с нулевым завершением, на которую указывает указатель. Этот конструктор не explicit, поэтому его можно использовать в неявных преобразованиях.

person Mankarse    schedule 30.08.2012

Посмотрите на конструкторы std::string. Что происходит, так это то, что компилятор нашел конструктор, который принимает ваш const char* и использовал его для автоматического преобразования const char* в std::string. Кстати, я бы предложил вместо этого использовать const std::string& prompt.

person Grzegorz    schedule 30.08.2012