2012-06-12 5 views
1

가능한 중복 :
Concatenate two string literalsconst를 문자열 나던 일 경우

하지 않는 이유는이 작품?

const std::string exclam = "!";   
const std::string message = "Hello" + ", world" + exclam; 

하지만이 나에게

const std::string exclam = "!";  
const std::string message = exclam + 
"Hello" + ", world" ;  

을 설명해주십시오 잘 작동합니다.

감사

+0

http://www.cplusplus.com/forum/beginner/13507/ – csj

답변

1

표준 : 문자열 번째 예에서 사용되고 무엇인가 + 연산자를 가지고있다. const char *에는 첫 번째 예제에서 사용되는 해당 연산자가 없습니다.

3

"Hello" + ", world"std::string이 아니고 두 개의 const char[] 인수가 포함되어 있기 때문에. 그리고 서명이있는 연산자 +는 없습니다. 먼저 std::string에 그 중 하나를 변환 할 수 있습니다

const std::string message = std::string("Hello") + ", world" + exclam; 
+1

이렇게하면 작동합니다. 'const std :: string message = "Hello"+ (", world"+ exclam);' – jrok

0

는 연관성까지입니다.

두 번째 경우는 std::string이고 왼쪽에서 시작하여 operator+과 연결됩니다. 첫 번째 경우는 const char *으로 시작하며 연결은 operator+입니다.

+0

http : //www.learncpp.com/cpp-tutorial/31-precedence-and-associativity/ – John

5

그 이유는이 두 개의 문자열 리터럴을 추가에 대한 operator+ 없으며, 필요하지 않을 것입니다. 방금 +을 제거하면 첫 번째 예는 작동합니다.

const std::string message = "Hello" ", world" + exclam; 

처리기 컴파일러 매직 *)은 함께 두 인접하는 리터럴을 추가 때문이다. std::string 리터럴 문자열을 추가하는 operator+을 가지고 있기 때문에

두 번째 예는 작동합니다. 결과는 다음 리터럴을 연결할 수있는 다른 문자열입니다.


*) 번역 단계 6-인접 문자열 리터 연결된 토큰이다. 은 "마지막에 추가 된 경우 CONST 문자열이 작동하지 않습니다"

+0

nitpick, 문자열 연결은 전처리기에 의해 실제로 수행되지 않습니다 (즉, 우리가 전처리기를 피하는 방법을 피할 필요가 없음을 의미합니다) – bames53

+0

Ok, 그 컴파일러 * 마술을 만들어라. –

0

은 붉은 청어입니다. 문제가 해결되지 않는

const std::string message = "Hello" + ", world"; 

이유는 다른 답변에서 설명하고있다 :이 역시 작동하지 않습니다.