2012-08-05 2 views
14

성병 :: shared_ptr의 생성자는 작동하지 않는? 컴파일러는 다음과 같습니다표준 : : shared_ptr의 및 초기화 목록

$의 그 소리 ++ --version 애플 연타 버전 4.0 (태그/애플/그 소리-421.0.57) (LLVM의 3.1svn 기준)

편집 : shared_ptr을 대신 make_shared.

당신은 당신이 그 인수로 구성 새로운 개체를 만들려면 make_shared를 사용할 필요가
make -k 
clang++ -std=c++11 -stdlib=libc++ main.cc -o main 
main.cc:28:18: error: no matching function for call to 'make_shared' 
     auto ptr = std::make_shared<Func>({"foo", "bar", "baz"}); 
       ^~~~~~~~~~~~~~~~~~~~~~ 
/usr/bin/../lib/c++/v1/memory:4621:1: note: candidate function not viable: 
    requires 0 arguments, but 1 was provided 
make_shared(_Args&& ...__args) 
^ 
1 error generated. 

답변

21

이 시도 :

auto ptr = std::make_shared<Func>(std::initializer_list<std::string>{"foo", "bar", "baz"}); 

연타가 {"foo", "bar", "baz"}의 유형을 추론하고자하지 않습니다. 나는 그것이 언어가 작동해야하는 방법인지 또는 컴파일러 버그를보고 있는지 여부에 대해 현재 확실하지 않습니다.

+5

마지막으로 완벽한 초기화는 이니셜 라이저 목록과 관련하여 실제로 완벽하지는 않습니다. – Puppy

+2

{ "foo", "bar", "baz"}는 표현식이 아니며 유형이 없습니다 (자동으로 사용되는 경우 제외). – Cubbi

3

가하는 shared_ptr 가리키는 :

다음은 오류입니다. shared_ptr<T>T에 대한 포인터와 비슷합니다. 포인터 ~ T으로 구성해야하며 T이 아닙니다.

편집 : 이니셜 라이저 목록이 포함될 때 완벽한 전달은 실제로 완벽하지 않습니다. 이것은 컴파일러의 버그가 아닙니다. 유형 Func의 직사각형을 수동으로 만들어야합니다.

+0

죄송합니다. 문제는 make_shared에서 발생했습니다. 나는 futzing하는 동안 그것을 shared_ptr로 바 꾸었습니다. – dpj

4

shared_ptr<T>의 생성자는 인수로 T* 유형의 포인터를 사용하며 동적으로 할당 된 자원 (또는 최소한 삭제 자에 의해 해제 될 수있는 것)을 가리키는 것으로 가정합니다. 반면에 make_shared은 생성자를 대신하여 생성자 인수를 직접 가져옵니다.

std::shared_ptr<Foo> p(new Foo('a', true, Blue)); 

또는 더 효율적으로 훨씬 더 :

는 그러니이 말 프로세스가 생성에서

auto p = std::make_shared<Foo>('a', true, Blue); 

후자의 형태는 당신을 위해 할당 및 건설을 담당하고, 보다 효율적인 구현.

물론 make_shared<Foo>(Foo('a', true, Blue))이라고 말할 수도 있지만 불필요한 사본 (생략 될 수 있음)을 만들뿐 아니라 더 중요한 것은 불필요한 중복을 만듭니다. [편집] 당신의 벡터를 초기화, 이것은 최선의 방법이 될 수 있습니다

auto p = std::make_shared<Func>(std::vector<std::string>({"a", "b", "c"})); 

공유-PTR 생성자가 을 수행하면서 중요한 점은,하지만, 그 make_shared, 당신의 동적 할당을 수행한다이 아니며 은 소유권이입니다.

+0

죄송합니다. 너희들은 너무 빨라!문제는 make_shared에서 발생했습니다. – dpj

+0

"*하지만 단지 불필요한 사본을 만들 것입니다 *"불필요한 움직임. – ildjarn

+0

@ildjarn : 음, 그게 모두 달려 있니? 어쨌든, "이동"은 단지 최적화 된 복사물입니다 :-) –