Строки, введенные в двойных кавычках, происходят из C-наследия C ++ (они называются C-строкой или NUL-концевой строкой). Они реализуются компилятором как массив char
. Напротив, std::string
- это класс C ++, целью которого является упрощение манипулирования строками. Он владеет строкой C (и может быть создан из нее, поскольку имеет конструктор, принимающий const char*
) и управляет своей памятью.
Поскольку существует конструктор std::string
из const char*
и эта строка C совместима с этим типом, почему компилятор не может вызвать эту функцию? Это потому, что функция принимает неконстантную ссылку на std::string
объектов. В этой ситуации конструктор нельзя использовать, поскольку созданные объекты будут временными, и вы не сможете получить неконстантную ссылку на временный объект, так как вызываемая функция может изменить его.
Вы можете создать std::string
и передать их функции:
std::string s1("String 1");
std::string s2("String 2");
std::string s3("String 3");
site(s1, s2, s3);
Или вы можете изменить прототип функции site
, чтобы принимать константную ссылку. Это возможно только в том случае, если функция не изменяет объекты и у вас есть доступ к коду:
// Declaration
void site(const std::string& s1, const std::string& s2, const std::string s3);
// Usage
site("String 1", "String 2", "String 3");