STL Push_back向量中的字符串

STL Push_back string in vector

本文关键字:字符串 向量 back Push STL      更新时间:2023-10-16

我正在尝试在字符串向量中推送字符串,如下所示

void Node::set_val(string &val)
{
    this->val.push_back(val);
}

但是当我尝试将其称为以下名称时

Obj.set_val("10h;");

我收到以下错误,

error: no matching function for call to 'Node::set_val(const char [5])'

我假设" "中的字符串与c ++中的字符串string相同,为什么会出现这样的错误?下面需要更改什么?

您正在通过非常量引用来获取std::string。非常量引用不能绑定到右值,如"10h;",因此不能将文字传递给该函数。

如果你不打算修改参数,你应该通过引用 const 来获取你的参数:

void Node::set_val(const string &val)
//                 ^^^^^

这样,将从您的const char[5]构建一个临时std::string并传递给set_val

您可以通过按值获取string并将其movevector中来改善这一点:

void Node::set_val(string val)
{
    this->val.push_back(std::move(val));
}

这可以防止您制作一些不必要的副本。

因此,在C++中,const char* 可以隐式转换为 std::string,因为 std::string 有一个(非显式)构造函数,它采用 const char*。因此,编译器在这里尝试的是为您的函数调用创建一个临时的 std::string 对象,如下所示:

Node.set_val(std::string("10h;"));

但是,由于您将 set_val 参数声明为对 std::string 的非常量引用,因此编译器无法使此转换工作,因为临时对象不能绑定到非常量引用。

有三种方法可以完成此操作,具体取决于您要实现的目标:

void Node::set_val(const std::string& val) {}
void Node::set_val(std::string val) {}
void Node::set_val(std::string&& val) {}

所有这些都将编译(最后一个需要 C++11 或更高版本),但看到您的用例,我建议使用第二个或第三个。有关原因的解释,请尝试阅读 C++11 中的移动语义。

这里要带走的重要一点是,const char* 通过创建一个临时对象隐式转换为 std::string,并且临时对象不能传递给接受非 const 引用的函数。

您正在传递"10h;"这是一个常量字符数组。

通过传递字符串来修复它:Obj.set_val(string("10h"));和编辑函数以按值获取字符串:

void Node::set_val(string val) { /* */ }

或者更好的是,编辑您的函数以const string&

void Node::set_val(const string &val) { /* */ }