C++ const char* 到 std::string &

C++ const char* to std::string &

我有一个编译代码,它看起来像:

    void test1(const std::string &name)................
    test1("myName");

但是,如果我将 const 从声明中删除为:

    void test2(std::string &name)................
    test2("myName");

代码无法编译。

为什么 const std::string 可以编译?据我了解,将调用相同的隐式构造函数将 char * 转换为 std::string.

我正在使用 Visual Studio 2013,以防这可能与答案有关。

在第二种情况下会出现错误,因为临时对象无法绑定到非常量引用。

test("myName"); 尝试在第二种情况下将临时构造的对象绑定到左值,因此出现错误

问题出在您用作参考的 & 上。使用 字符串文字 调用函数时,您不能传递非常量引用。

当隐式转换发生时,你会得到一个 temporary std::string(从技术上讲,重要的是它是一个 xvalue)。您不能将临时值绑定到左值引用 std::string &,但可以绑定到 const 左值引用 const std::string & 或右值引用 std::string &&.

同样的事情发生在这里:

const int &x = 5;
int &x = 5; // error

"myName" 是一个 C 风格的字符串,它的类型是 const char[]。由于它不是 std::string,因此需要将其转换为一个。当发生这种情况时,将创建一个临时 string。该临时字符串不能绑定到引用,但可以绑定到 const 引用,因为它将其生命周期延长到表达式的末尾。

您也可以通过右值引用传递 string,例如 void foo(std::string && bar)。这会将临时 string 移动到函数中并为您提供相同的效果。

第三个选项是按值 void foo(std::string bar) 传递 string。这适用于临时对象和非临时对象,并且会根据字符串的来源进行复制或移动。