2013-02-05 1 views
2

생성자와 "외모가있는"함수에 할당 할 수있는 이유는 무엇입니까?생성자에 지정 하시겠습니까? (튜플 티처럼)

예 :

struct Bar { 
    Bar() : b_(false) {} 
    Bar(bool b) : b_(b) {} 
}; 

struct Foo { 
    Foo(Bar const & bar) : bar_(bar) {} 
    Foo operator=(Foo const & f) { return Foo(f.bar_); } 
    const Bar & bar_; 
} 

Foo bool_to_foo(bool b) { return Foo(Bar(b)); } 

Foo MakeFoo(Bar const & bar) { return Foo(bar); } 

왜이 작품은 않습니다

Bar bar; 
MakeFoo(bar) = bool_to_foo(true); 

이 작동하지 않는 이유는 무엇입니까?

Bar bar; 
Foo(bar) = bool_to_foo(true); // Error: 'bar': redefinition; different basic types 

MakeFoo (.)와 Foo (.)는 동일한 서명과 동일한 기능을 갖습니다.

생성자의 특별한 점은 무엇입니까?

+1

"기능에 할당"할 수 없습니다. 그러나 함수 객체에 할당 할 수 있습니다! –

+0

아, 그리고 코드의 표현식에서'Foo()'를 볼 때, 그것은 "생성자"가 아닙니다. _directly_ 호출하거나 생성자를 참조하는 것은 불가능합니다. –

+2

코드에서 "함수에 할당"하지 않으면 함수의 반환 값에 할당하려고합니다. – PlasmaHH

답변

8

이 줄 :

Foo(bar) = bool_to_foo(true); 

은 당신이하지 생각하지 않습니다. 이 아닌bar으로 초기화 된 임시 개체를 선언합니다. Foo 유형의 bar이라는 개체를 선언하고 bool_to_foo(true) 값으로 초기화하는 것은 실제로 수행됩니다. 이미 범위 bar라는 이름의 객체가이 재정의입니다 가지고 있기 때문에

Foo bar = bool_to_foo(true); 

: 그런 의미에서

, 그것은 정확히 동일합니다. 그 추한과 혼란 모두이기 때문에, 나는 그것을 더 설명하지 않습니다,

Foo((0,bar)) = bool_to_foo(true); 

을하지만 :


당신은 아직도 당신이 뭘 하려는지하고 싶은 경우

, 당신은 시도 할 수 있습니다.

+0

'/ 할 /하지 않는다 /' –

+0

@ LightnessRacesinOrbit's/d/D/g' : P –

+0

@ LightnessRacesinOrbit - 감사합니다. –

0

함수는 객체를 반환하며이 객체는 할당 할 수 있습니다. 그러나 C++ 표준은 생성자에게 특별한 처리 방법을 제공합니다. 비록 내가 완전히 확신 할 수는 없지만, = bool_to_foo(true) 부분은 할당이 아닌 초기화로 간주됩니다. foo에 복사 생성자가 없으므로 오류가 발생합니다.

Rob도 Foo (bar) 거래로 머리에 못을 박았다. 때때로 C++ 구문이 이상 할 수 있습니다.

어쨌든이 두 형식 중 하나는 나쁜 습관입니다. rvalues에 할당하는 것은 일 것입니다. 아마도은 사용자가 원하는 것이 아니며 혼란 스러울 가능성이 큽니다.

+0

@Robert - C++의 "나쁜 습관"은 하스켈의 SOP 인 것처럼 보입니다. 그들은 타입 생성자에게 항상 할당하는 것 같습니다. FP 세계에 조금 나가 려구요! –

+1

@DavidH : 하스켈은 굉장합니다. 그러나 스타일/연습은 여러 언어로 이식되지 않습니다. C++에서이 구문은 Haskell에서의 사용법과 완전히 다른 것을 의미합니다. 'MakeFoo (bar) = baz (quuz) '가 C++에서 의미하는 것은 그 표현식 *의 목적이 * 부작용이라는 것입니다. 하스켈의 어떤 것과도 정반대입니다. –