2011-01-31 6 views
4

작동하며 작동하지 않습니다. 괜찮습니까?std :: string s = (std :: string) "a"+ "b"+ "c"; 승인?

편집 : A는 "가리키는 것은 표준 : : 문자열은" "그냥 어떤 가정", 물어 이유는 std::string s = "a" + "b" + "c";이 컴파일러 오류가 발생한다는 것입니다, 그리고 (std::string)"a" 그냥 컴파일러를 알려줍니다. 그리고 std :: string이 어떻게 구현되는지 실제로 알지 못했습니다.

모두의 의견에 감사드립니다.

+0

나는 std :: string s = (std :: string) ("a"+ "b"+ "c")를 의미한다고 생각한다. ? – BlackBear

+0

@BlackBear는 컴파일하지도 않습니다. 서로 포인터를 추가 할 수 없기 때문입니다. – Timbo

+0

@BlackBear : 그건 실패합니다.그의 코드는 "a"를 문자열 객체에 캐스트 한 다음 연결을 수행합니다. 당신은 실패 할 두 포인터를 추가하려고 시도합니다. –

답변

6

예. +은 왼쪽 연관이므로 ((std::string)"a" + "b") + "c"과 같습니다. std::string::operator+은 오버로드되어 const char *을 인수로 취합니다.

5

예. 괜찮아.

그것은

std::string s = "a"; 
s += "b"; 
s += "c"; 
+0

C 스타일 캐스팅 제외 – ThomasMcLeod

+0

실제로 해석은 주제 작성자의 것보다 효과적입니다. 문자열 개체가 하나 뿐이며 세 개의'const string'을 만듭니다 – ssmir

+0

@ssmir : 그는 세 가지를 만들 수도 있고 만들지 않을 수도 있습니다 'std :: string'은 확실히'const'가 아닙니다. 그것들은 컴파일러에 의해 생략 될 수 있고, 이동 의미론은 확실히 3 가지를 제거합니다. – GManNickG

1

std::string을 수행하는 대부분 동등한 것은 형 const char *의 우측 인자를 멤버 함수 operator +있다. const char *을 운영자의 왼쪽에 둘 수있는 전 세계적으로 정의 된 operator +이 있습니다.

// std::string::operator + (const char *) 
std::string a; 
a = "b"; 

// global operator + (std::string, const char *) 
std::string a; 
a = (std::string)"b" + "c"; 

// global operator + (const char *, std::string) 
std::string a; 
a = "b" + (std::string)"c"; 

인수 타입 캐스트 문자열 리터럴 유형 const char *의 때문에 std::string에해야하는 이유. "a" + "b"을 수행 할 때 발생하는 문제는 컴파일러가 할당 문에 std::string 유형의 객체가 없으므로 포인터를 함께 추가하려고 시도한다는 것입니다. 이를 방지하려면 char * 용어의 왼쪽 또는 오른쪽에 std::string 유형의 용어가 있어야합니다.

1

는 더 좋을 것이다 :

std::string s(std::string("a") + "b" + "c"); 
+1

나는 그것이 더 나은 이유는 모르겠다. – GManNickG

+0

@GMan, 더 C++ 같아. :) – ThomasMcLeod

+0

아마도. 제 생각에 카피 스타일이없는 캐스팅 포인트는 복사 초기화가 손실되는 가운데 목록에 포함 된 것으로 생각됩니다. – GManNickG

2

(std::string)"a"는 컴파일러를 알려줍니다

아니,이 무슨 캐스트 아니다 "그냥 어떤 "a"가 가리키는 것은 std::string입니다 추정" 객체 유형을 의미합니다. 오브젝트 유형에 대한 형변환은 명시 적 변환 요구입니다. (std::string)"a" 리터럴 (const char[]) "a"에서 임시 std::string을 구성. 선언 std::string s = (std::string)"a" + "b" + "c";에서

이 임시 생활 s 완료의 초기화까지 "를 의미한다. (12.2 class.temporary/4)

있다 (적어도) 두 개의 추가 임시 생성자가 생성되고 첫 번째 임시에 operator+을 적용한 결과 "b"operator+을 임시로 적용한 결과 "c2"이 마지막 임시는 s을 초기화하는 데 사용됩니다. 초기화가 완료되면 임시 직원은 다시 파괴된다. 그들의 운문 순서.

초기화가 유효하며 올바르게 정의되어 있습니다.

+0

이봐 요, 고맙습니다. 그래서 원시 타입과는 다르다 - 나는 그것이 같을 것이라고 생각했다. (int) "hello"또는 (char *) n은 내가 설명한대로 작동합니다. – Mark

관련 문제