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
。这适用于临时对象和非临时对象,并且会根据字符串的来源进行复制或移动。
我有一个编译代码,它看起来像:
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
。这适用于临时对象和非临时对象,并且会根据字符串的来源进行复制或移动。