2016-10-24 3 views
2

직접 {} 생성자 * CHAR에서 STD : 문자열 초기화 . 이 작품 :C++ 11 I는 <code>std::string&</code> 함수를 받아 갖는

const char* s1 = "test"; 
std::string s2{s}; 
f(s2); 

이되지 않습니다

const char* s1 = "test"; 
f({s1}); 

왜 이것이 가능하지? 재미있는 것은 CLion IDE 불평되지 않는 것입니다,하지만 컴파일러는 다음과 같습니다

no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::basic_string<char>&’ 
+3

왜 작동하길 기대합니까? – juanchopanza

+1

함수는 참조로 문자열을 예상하고 두 번째 옵션은이를 수행하지 않습니다. 첫 번째 예제에서's1'은 예제를 제외하면 완전히 불필요합니다 :'std :: string s2 = "test";' – crashmstr

+1

* 재미있는 점은 CLion IDE가 불평하지 않지만 컴파일러는 다음과 같습니다 : * - CLIon 컴파일러가 아닙니다. 컴파일러가 이깁니다. – PaulMcKenzie

답변

4

char const*에서 std::string 구축과는 아무 상관이 없습니다.

f은 lvalue를 문자열로 예상하고 그 자리에 임시 인스턴스를 생성하여 비 구형 lvalue 참조에 바인딩 할 수없는 rvalue를 제공합니다. f(string{})은 유효하지 않습니다.

+0

음, f는 lvalue *를 기대합니다. lvalue 참조 매개 변수를 사용하는 것은 C++에서 표현하는 방법이지만 "f가 참조를 기대합니다"라는 의미는 아닙니다. –

+0

@KerrekSB 이해할 수 있는지 잘 모르겠습니다. 함수가 lvalue 참조를 기대하고, lvalue를 전달하면 참조가 그것에 연결되어 있다고 생각했습니다. – krzaq

+0

"참조를 기대할 수는 없습니다." 함수는 인수를 사용하여 호출되며 인수는 표현식이며 표현식은 절대로 참조가 아닙니다. 중요한 것은 표현이 좌변가라는 것입니다. 참조 란 * lvalues에 대해 이야기하는 방법입니다. –

0

한 가지 옵션은 참조가 아닌 값으로 문자열을 가져 오도록 함수를 변경하는 것입니다. 그 때 그것은 작동 할 것이다. 어쨌든, C++ 11에서는 때때로 참조가 아닌 값으로 전달하는 것이 바람직합니다.

1

함수가 const가 아닌 참조를 받고 복사 또는 const 참조 매개 변수가 필요한 임시 객체를 전달 중입니다.

void f(string&& s) { f(s); } 

내 다른 오버로드를를 rvalue 참조로 객체를 받고 전화를 다른 함수를 만드는 두 솔루션은 매개 변수로 임시 개체를 허용하거나 객체를받을 함수 정의를 변경하되 일정한 기준으로

void f(const std::string& s) { ... }