2013-07-09 5 views
0

코드 스 니펫이 발생하여 copy-constructor을 호출 할 것이라고 생각했지만 대조적으로 단순히 일반 생성자를 호출했습니다. 다음은 B ob = "copy me";개념적으로 리터럴에서 B을 생성한다는 것을 발견하고 구조 ob을 복사 한 어떤 코드복사 생성자가이 경우에 호출되지 않는 이유는 무엇입니까?

#include <iostream> 
using namespace std; 
class B 
{ 
    public:  
    B(const char* str = "\0") 
    { 
     cout << "Constructor called" << endl; 
    }  
    B(const B &b) 
    { 
     cout << "Copy constructor called" << endl; 
    } 
}; 
int main() 
{ 
    B ob = "copy me"; 
    return 0; 
} 
+1

http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization –

+6

왜 복사 생성자를 호출하기를 기대할 수 있습니까? ''copy me ''는'const char [8]'이고'B'가 아닙니다 ... –

+7

@ H2CO3 복사 초기화이기 때문에. 그것은 이론적으로 그것을 호출해야합니다. –

답변

8

이지만, 컴파일러는 사본을 생략하다 및 ob로 디렉토리를 구성 할 수 있는지. g ++은 최적화가 전혀 활성화되지 않은 채 복사본을 삭제합니다.

복사 생성자를 비공개로 설정하면이 경우에 해당합니다. 컴파일러에서 실제로 복사 생성자를 사용하지 않아도 코드가 컴파일되지 않습니다 (표준에서는 호출 생성자 생략 됨).

+0

+1 두 번째 단락은 VC++ (적어도 2010 년까지)에서 주목할만한 내용입니다. 그것은 내가 발견 한 것과 같은 방식으로 행동하며 위의 일반 섹션에서 언급 한 내용에서 제외되었습니다. – WhozCraig

+0

그래, 비공개로 선언하는 것에 관한 두 번째 단락은 거의 모든 것을 설명한다. –

+1

참고 : g ++에서 '-fno-elide-constructors' 옵션으로 elion 복사를 비활성화 할 수 있습니다. (편집 : 나는 Praetorian의 코멘트를 보지 못했다. (http://stackoverflow.com/questions/17552785/why-is-copy-constructor-not-called-in-this-case#comment25532859_17552785) ...) –

관련 문제