Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么它试图发送一个字符数组而不是字符串?_C++_Class_Function_Types_Arrays - Fatal编程技术网

C++ 为什么它试图发送一个字符数组而不是字符串?

C++ 为什么它试图发送一个字符数组而不是字符串?,c++,class,function,types,arrays,C++,Class,Function,Types,Arrays,我的函数声明是 siteObject(std::string&url,std::string&get,std::string&post) 那么为什么这是站点(“字符串1”、“字符串2”、“字符串3”);创建不匹配类型错误。它说它需要一个字符串引用,它正在接收一个字符数组。如果您需要更多详细信息,请在注释中询问。因为有一个对std::string构造函数的隐式调用,它创建了一个临时对象。不能将非常量引用用于临时引用(因为修改临时引用没有意义) 因此,要么修改函数以获取常量引用,要么按值传递,要么传

我的函数声明是
siteObject(std::string&url,std::string&get,std::string&post)


那么为什么这是
站点(“字符串1”、“字符串2”、“字符串3”)
;创建不匹配类型错误。它说它需要一个字符串引用,它正在接收一个字符数组。如果您需要更多详细信息,请在注释中询问。

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

因此,要么修改函数以获取
常量
引用,要么按值传递,要么传递非临时对象。

正确的调用是:

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

siteObject(url, get, post);
这是有意义的,因为方法签名意味着您在三个字符串(非常量引用)中得到了一些返回值,您可以使用这些返回值

如果不是这样,并且您可以更改siteObject()方法,那么您应该执行以下操作:

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

并使用原始调用。

您的
siteObject
功能:

siteObject(std::string& url, std::string& get, std::string& post);
std::string s1("String 1");
std::string s2("String 2");
std::string s3("String 3");
site(s1, s2, s3);
对不能绑定到右值(或临时值)的字符串对象进行非常量引用

当您尝试使用字符串文本调用函数时,编译器必须将这些参数(即
char*
)转换为与参数类型匹配的参数-这种转换会产生一个临时
std::string
对象

如果希望能够将常量引用绑定到临时引用,则需要更改函数以接受常量引用:

siteObject(std::string const& url, std::string const& get, std::string const& post);
或者可以传递值而不是引用:

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

您需要让函数接受<代码> const STD::String和STR 或构造字符串实例,而不依赖于CHAR*到字符串对象的隐式转换。

双引号字符中的字符串来自C++的C++继承(它们称为C字符串或NUL终止字符串)。它们由编译器以

char
数组的形式实现。相反, STD::String 是一个C++类,旨在简化字符串的操作。它拥有一个C字符串(可以从一个字符串创建,因为它有一个接受
常量char*
)的构造函数),并管理它的内存

既然存在来自
const char*
std::string
的构造函数,并且该C字符串与该类型兼容,为什么编译器不能调用该函数?这是因为函数正在对
std::string
对象进行非常量引用。在这种情况下不能使用构造函数,因为创建的对象是临时对象,并且您无法获得对临时对象的非常量引用,因为被调用函数可能会对其进行变异

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

siteObject(std::string& url, std::string& get, std::string& post);
std::string s1("String 1");
std::string s2("String 2");
std::string s3("String 3");
site(s1, s2, s3);
或者您可以更改
站点
函数的原型以接受常量引用。只有当函数不改变对象并且您有权访问代码时,这才可能:

// Declaration
void site(const std::string& s1, const std::string& s2, const std::string s3);

// Usage
site("String 1", "String 2", "String 3");

这是唯一的方法吗?这在比MSVC更符合标准的编译器上不起作用。既然您想将一个临时对象作为非常量引用传递。@Will03,您也可以将您的过程编写为
siteObject(const std::string&url,const std::string&get等)。
@Muggen:如果函数中的字符串没有更改,那就行了。长话短说:C设计人员让string literaks type
char[]
;C++设计者使C++与C兼容,并给每个C++程序员,包括你,一堆烦恼,包括这个烦恼。这不是回答问题??@ Wel03UK:更新答案!