2013-08-24 4 views
-1
void f(string &x); 
.. 
f(string("hello1")); 
... 
f(new string("hello2")); 
  1. 문자열 ("hello1")이 함수 호출인지 또는 생성자 호출인지 컴파일러에서 어떻게 알 수 있습니까?
  2. hello1과 hello2의 차이점은 무엇입니까?
+8

두 번째 것은 컴파일되지 않습니다. 'f()'함수는 'string'을 참조로 받아서'string to pointer '를 전달하려고합니다. – Blastfurnace

+0

'string' 함수의 이름을 지정하면 컴파일되지 않습니다. 따라서 항상 생성자가됩니다. – ApproachingDarknessFish

+3

@Blastfurnace 함수가 const가 아닌 참조를 기대하고 임시로 제공하기 때문에 첫 번째 컴파일 방법도 알아야합니다. 그래서 ..이 모든 것은 작동하지 않습니다. – WhozCraig

답변

2

1) 일반적으로 문맥에서. C++에는 예를 들어 Rust와 같은 문맥 자유 문법이 없습니다. 그러나이 특별한 경우에는 항상 문자열 구성입니다. 또한, const가 아닌 refeference에 rvalue를 전달하기 때문에 컴파일되지 않습니다.

2) hello2는 힙에 새로운 문자열 객체를 만들고 hello1은 생성하지 않습니다. 또한 이와 같은 참조를 기대하는 함수에 대한 포인터를 전달할 수 없습니다. 단순히 msvc, gcc, cland 등으로 빌드하지는 않습니다.