내 함수 선언은
입니다. siteObject(std::string& url, std::string& get, std::string& post);
문자열 대신 문자 배열을 보내려고하는 이유는 무엇입니까?
왜 site("String 1", "String 2", "String 3")
입니까? 불일치 유형 오류가 발생합니다. 문자열 참조가 필요하고 char 배열을 받고 있다고합니다. 더 자세한 내용이 필요하면 의견을 물어보십시오.
내 함수 선언은
입니다. siteObject(std::string& url, std::string& get, std::string& post);
문자열 대신 문자 배열을 보내려고하는 이유는 무엇입니까?
왜 site("String 1", "String 2", "String 3")
입니까? 불일치 유형 오류가 발생합니다. 문자열 참조가 필요하고 char 배열을 받고 있다고합니다. 더 자세한 내용이 필요하면 의견을 물어보십시오.
std::string
생성자에 대한 암시 적 호출이 있으므로 임시 개체가 만들어집니다. 임시가 아닌 임시 참조를 참조 할 수는 없습니다 (임시 수정이 의미가 없으므로).
따라서 함수를 수정하여 const
참조 또는 by-value를 가져 오거나 비 임시 대상으로 전달하십시오.
올바른 호출은 다음과 같습니다 메소드 서명이 다시 세 개의 문자열 (const가 아닌 참조)에서 무언가를 얻을 것을 의미하고 그 반환 값을 사용할 수 있기 때문에
는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);
이 우변 (또는 임시직)에 바인딩 할 수 없습니다 문자열 객체에 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);
함수가 const std::string& str
을 수락하도록 허용하거나 전달할 문자열 인스턴스를 구성하고 char *을 문자열 객체로 암시 적으로 변환하지 말아야합니다.
큰 따옴표 문자로 입력 된 문자열은 C++의 C 유실 (C 문자열 또는 NUL 종료 문자열)에서 나옵니다. 그들은 char
배열로 컴파일러에 의해 구현됩니다. 반대로 std::string
은 문자열 조작을 단순화하는 것을 목표로하는 C++ 클래스입니다. 그것은 C 문자열을 소유하며 (const char*
을 수락하는 생성자를 가졌기 때문에 C 문자열을 소유하고 생성 할 수 있으며 해당 메모리를 관리합니다.
const char*
에서 std::string
의 construtor가 있고 그 C 문자열이 해당 유형과 호환 가능하므로 컴파일러가이 함수를 호출 할 수없는 이유는 무엇입니까? 이것은 함수가 std::string
객체에 대한 비 const 참조를 취하기 때문입니다.생성 된 객체가 임시 객체가 될 것이므로 생성자는이 상황에서 사용할 수 없으며 임시 객체에 대한 비 const 참조를 얻을 수 없습니다. 호출 된 함수가이를 변형 할 수 있기 때문입니다.
당신은 std::string
를 생성하고 함수에 전달할 수 있습니다 :
std::string s1("String 1");
std::string s2("String 2");
std::string s3("String 3");
site(s1, s2, s3);
을 또는 당신은 const를 참조를 허용하도록 site
함수의 프로토 타입을 변경할 수 있습니다. 이것은 함수가 객체를 변경시키지 않고 코드에 액세스 할 수있는 경우에만 가능합니다.
// Declaration
void site(const std::string& s1, const std::string& s2, const std::string s3);
// Usage
site("String 1", "String 2", "String 3");
Long story short : C 디자이너는 string literak 유형'char []'을 만들었습니다. C++ 디자이너는 C++을 C와 호환 가능하게 만들었으며 모든 C++ 프로그래머에게 당신을 포함하여이 모든 것을 포함하여 귀찮은 번거 로움을주었습니다. – delnan