【问题标题】:C++ const char* to std::string &C++ const char* 到 std::string &
【发布时间】:2016-02-10 04:06:32
【问题描述】:

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

    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,以防这可能与答案有关。

【问题讨论】:

  • 电话test1("myName");也不是吗?
  • @AhmedAkhtar 是的,对不起,我正在调整我的代码以使其简短,我错过了这个细节,谢谢!
  • 解决编译器错误的另一种方法是将第二种情况下的函数调用设为test1(std::string("myName"));

标签: c++ string constants std


【解决方案1】:

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

同样的事情发生在这里:

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

【讨论】:

  • 我之前听说过左值...但不是 xvalue 或 rvalue...您介意详细说明它们之间的区别吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    【解决方案4】:

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

    【讨论】: