为什么要尝试发送char数组而不是字符串?

时间:2011-01-19 20:25:04

标签: c++ class function types arrays

我的功能声明是
 siteObject(std::string& url, std::string& get, std::string& post);

为什么这是site("String 1", "String 2", "String 3");创建不匹配类型错误。它说它想要一个字符串引用,并且它正在接收一个char数组。如果您需要更多细节,请在评论中提问。

5 个答案:

答案 0 :(得分:6)

因为对std::string构造函数有一个隐式调用,它会创建一个临时对象。你不能对非临时引用非const引用(因为修改临时修改没有意义)。

因此,要么修改函数以获取const引用,要么修改值,或者将其传递给非临时对象。

答案 1 :(得分:3)

您的siteObject功能:

siteObject(std::string& url, std::string& get, std::string& post);

对字符串对象进行非const引用,这些对象不能绑定到右值(或临时值)。

当您尝试使用字符串文字调用该函数时,编译器必须将这些参数(char*)转换为与参数类型匹配的内容 - 该转换将导致临时std::string对象

如果您希望能够将它们绑定到临时对象,则需要更改函数以接受const引用:

siteObject(std::string const& url, std::string const& get, std::string const& post);

或者您可以传递值而不是引用:

siteObject(std::string url, std::string get, std::string post);

答案 2 :(得分:1)

正确的电话是:

std::string url("...");
std::string get("...");
std::string post("...");

siteObject(url, get, post);

这是有道理的,因为方法签名意味着你在三个字符串(非const引用)中得到了一些东西,你可以使用这些返回值。

如果这不是意图,你可以更改siteObject()方法,那么你应该这样做:

siteObject(std::string const & url, std::string const & get, std::string const & post);

并使用您的原始电话。

答案 3 :(得分:1)

您需要使函数接受const std::string& str或构造字符串实例以传入,而不是依赖于将char *隐式转换为字符串对象。

答案 4 :(得分:0)

以双引号字符输入的字符串来自C ++的C遗产(它们被称为C字符串或NUL终止字符串)。它们由编译器实现为char的数组。相反,std::string是一个C ++类,旨在简化字符串的操作。它拥有一个C字符串(可以从一个字符串创建,因为它有一个接受const char*的构造函数),并管理它的内存。

由于存在来自std::string的{​​{1}}的构造,并且C字符串与该类型兼容,为什么编译器无法调用此函数?这是因为该函数对const char*个对象进行非const引用。构造函数不能在这种情况下使用,因为创建的对象是临时对象,并且你不能获得对临时对象的非const引用,因为被调用的函数可能会改变它。

您可以创建std::string并将其传递给函数:

std::string

或者您可以更改std::string s1("String 1"); std::string s2("String 2"); std::string s3("String 3"); site(s1, s2, s3); 函数的原型以接受const引用。只有当函数不改变对象并且您可以访问代码时,才可以执行此操作:

site