Как char [] интерпретируется как const std :: strings в аргументах - PullRequest
2 голосов
/ 24 декабря 2010

Я недавно понял, что могу сделать это:

void someFunc(const std::string &str)
{
   //content
}

...
someFunc("Hello World"); //this works

Мне интересно, как это работает и почему это работает.

Спасибо

Ответы [ 6 ]

5 голосов
/ 24 декабря 2010

Это работает, потому что std::string имеет конструктор из const char *, который не помечен explicit. Компилятор C ++ вставит вызов одного такого конструктора (для каждого аргумента), если необходимо, чтобы аргументы совпадали.

4 голосов
/ 24 декабря 2010

Ваш пример на самом деле демонстрирует обратное: массив константных символов интерпретируется как std::string.(Кстати, строковый литерал не является const char *, это const char[N] - массив символов, а не указатель на символ).

Причина, по которой он работает, заключается в том, что массив символов неявно преобразуется в std::string с помощью конструктора преобразования std::string s.Компилятор выполняет преобразование для вас в полном соответствии с правилами разрешения перегрузки языка C ++.

3 голосов
/ 24 декабря 2010

Это работает, потому что компилятор создает временный объект типа std::string в вызывающей стороне перед вызовом someFunc().

Скомпилированный код будет примерно эквивалентен следующему:

{
    std::string _temp1("Hello World");
    someFunc(_temp1);
}

(Я поставил код в фигурные скобки, чтобы показать, что деструктор _temp1 будет выполнен сразу после возврата к вызову someFunc().)

0 голосов
/ 24 декабря 2010

Я думаю, что вы имеете в виду обратное: 'как const char * s интерпретируется как std :: strings'?Ну, есть конструктор класса std :: string, который конвертирует const char * в std :: string

Фактический конструктор можно найти в /usr/include/c++/4.3.4/bits/basic_string.h

 /**
  *  @brief  Construct string as copy of a C string.
  *  @param  s  Source C string.
  *  @param  a  Allocator to use (default is default allocator).
  */
  basic_string(const _CharT* __s, const _Alloc& __a = _Alloc());
0 голосов
/ 24 декабря 2010

Ваш вопрос задом наперед ... a const char* становится std::string при использовании в качестве аргумента, и это потому, что существует неявное преобразование (конструктор с одним аргументом) из const char* в std::string.

0 голосов
/ 24 декабря 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...