как std :: string справляется с этим трюком? - PullRequest
5 голосов
/ 25 января 2012

Я только что написал функцию:

void doSomeStuffWithTheString(const std::string& value) {
...
std::string v = value;
std::cout << value.c_str();
...
}

, но затем я вызываю это с помощью

doSomeStuffWithTheString("foo");

, и это работает.Поэтому я бы подумал, что для этого (const char * для инициализации неявного экземпляра std :: string) значение должно быть передано по значению, но в этом случае оно передается по (const) ссылке.

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

РЕДАКТИРОВАТЬ

что произойдет, если функция перегружена

void doSomeStuffWithTheString(const char* value);

, какая из них выбереткомпилятор?

Ответы [ 4 ]

7 голосов
/ 25 января 2012

Тип std::string имеет неявное преобразование (через конструктор) из const char*.Это то, что позволяет строковому литералу "foo" преобразовать в std::string.Это приводит к временному значению.В C ++ допустимо иметь временное значение const &, и, следовательно, все это вместе.

Возможно повторить этот трюк, используя ваши собственные типы в C ++.

class Example {
public:
  Example(const char* pValue) {}
};

void Method(const Example& e) {
  ...
}

Method("foo");
0 голосов
/ 26 января 2012

"значение должно быть передано по значению, но в этом случае оно передается по (const) ссылке."

Существует функция C ++, где можно передать временное значение (в этомВ этом случае временный std::string неявно преобразуется из const char *) в аргумент типа const-reference (в данном случае const std::string &).

0 голосов
/ 25 января 2012

Точно, используя std::string конструктор по умолчанию

0 голосов
/ 25 января 2012

Да, временный std::string создается из строкового литерала.

...