2014-10-15 2 views
13

std::make_unique을 사용하여 생성자가 std::initializer_list 인 클래스를 인스턴스화하려고합니다. 여기에 최소한의 경우 :make_unique/make_shared를 통해 initializer_list 생성자를 호출합니다.

#include <string> 
#include <vector> 
#include <initializer_list> 
#include <memory> 

struct Foo { 
    Foo(std::initializer_list<std::string> strings) : strings(strings) {} 

    std::vector<std::string> strings; 
}; 

int main(int, char**) { 

    auto ptr = std::make_unique<Foo>({"Hello", "World"}); 

    return 0; 
} 

당신은 그것을 구축하지 않는 Coliru에 볼 수 있습니다

main.cpp:14:56: error: no matching function for call to 'make_unique(<brace-enclosed initializer list>)' 
    auto ptr = std::make_unique<Foo>({"Hello", "World"}); 

그래서, initializer_list의를 사용하여 보도 할 수없는 make_unique입니까? GCC 4.9.1에 버그가 있습니까? 또는 나는 무엇인가 간과 했느냐?

+2

중괄호 목록은 템플릿 인수 공제로 추론 할 수 없습니다. 'make_unique (std :: initializer_list ({ "Hello", "World"}))'를 시도해보십시오. –

+0

@KerrekSB 글쎄, 그건 내 대답처럼 보입니다 :) – Quentin

+0

흠, 작동합니까, 그리고 도움이됩니까? –

답변

20

std::make_unique은 개체 생성자에 전달되는 인수 형식을 추론하는 함수 템플릿입니다. 안타깝게도 중괄호 목록은 공제 할 수 없으므로 (auto 선언은 예외) 누락 된 매개 변수 유형이있을 때 함수 템플릿을 인스턴스화 할 수 없습니다.

std::make_unique을 사용할 수 없지만 그 경로를 이동하지 마십시오. – 어린이를 위해서 할 수있는 한 많이 벌거 벗은 채로 피해야합니다.

  • std::make_unique<Foo>(std::initializer_list<std::string>({"Hello", "World"}))

  • std::make_unique<Foo, std::initializer_list<std::string>>({"Hello", "World"})

  • auto il = { "Hello"s, "World"s }; auto ptr = std::make_unique<Foo>(il);

마지막 옵션은 auto 선언에 대한 특별한 규칙을 사용하거나 유형을 지정하여 유형 공제 작업을 할 수 있습니다 , (내가 암시했던 것에 따라) do은 실제로 std::initializer_list을 추론합니다. 당신은 몇 가지 추가 문자를 입력 할 준비 경우

2

, 당신은이 작업을 수행 할 수 있습니다 init_list이 발생하는 공제를 허용

template<typename T> 
std:: initializer_list<T> make_init_list (std:: initializer_list<T> && l) { 
    return l; 
} 

로 정의하고, 편리합니다

auto ptr = std::make_unique<Foo>(make_init_list({ "Hello"s , "World"s })); 

을 코드에 여러 위치가 있으면이 작업을 수행해야합니다. .

은 (작품 연타 3.9과 GCC 6.2.0에 나는 g ++에서 작동하도록 있어요 -. 4.8.4을 또한, 나는 std::string -literal을 꼬집고 make_shared로 변경 한 것을 제외하고 그러나 make_init_listT의 공제 일 좋아요.)

사실,이 확장인가요? make_init_list에 대한 공제가 성공 했습니까?

관련 문제