Почему я могу передать "строку C" функции, ожидающей std :: string, и она работает? - PullRequest
1 голос
/ 03 августа 2011

У меня есть метод:

void Foo::Bar(const std::string &str)
{
    printf("%d", str.length());
}

и он работает без проблем, когда я

foo.Bar("hello");

Я думал "hello" был const char *, а не std::string?

Ответы [ 6 ]

8 голосов
/ 03 августа 2011

Существует два способа неявного преобразования пользовательских типов:

  1. С помощью конструктора преобразования (например, "std :: string :: string (const char * c_string)").
  2. С оператором преобразования (например, «OldType :: operator NewType () const»).

Любой конструктор, который принимает один параметр и не использует ключевое слово «явный», определяет неявныйпреобразование (из типа параметра в тип строящегося объекта).Стандартный класс строк намеренно не использует «явный» для обеспечения удобства этого преобразования.

7 голосов
/ 03 августа 2011

Поскольку std :: string имеет конструктор, который принимает const char *, C ++ автоматически создаст для вас временный строковый объект.

6 голосов
/ 03 августа 2011

Технически это char const[6], но да, вы должны быть в состоянии сделать это благодаря неявному преобразованию и одному из std::string конструкторов.

2 голосов
/ 03 августа 2011

в некоторой степени относится к вашему вопросу: если в C ++ есть время, когда вы * явно * просто не хотите, чтобы компилятор изменял для вас типы таким образом, когда существует совместимый конструктор, вы используетеключевое слово «явный» перед конструктором.Тогда это даст вам ошибку компилятора.Однако вы можете делать это только с теми типами, которые вы создаете.Не с типами STL, такими как string.

1 голос
/ 03 августа 2011

Потому что есть «неявный» преобразование из char * в std::string с помощью конструктора std::string(char *).

0 голосов
/ 03 августа 2011

Ваш строковый литерал имеет значение char const[6].

Имя его уменьшается до const char* для передачи в функцию.

Затем выполняется неявное преобразование, поскольку:

  • Функция принимает ref-to-const, то есть rvalue может быть привязана к ней
  • const char* может быть неявно преобразовано в std::string rvalue.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...