>

여기에 질문이 있습니다 : 비 기능 코드와 관련된 initializer_list 리턴의 수명 연장 :

const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };

나는 람다는 intializer_list 를 반환하려고 생각  (나쁘지 않습니다. 그렇게하지 마십시오.) 그러나 댓글 :

It's not an initializer_list 이니셜 라이저 목록입니다. 서로 다른 두 가지.

난 그냥 당신이 곱슬 중괄호 목록을 할 때마다 intializer_list 를 만들고 있다고 생각 . 이것이 일어나지 않으면 중괄호 목록은 무엇입니까?


  • 답변 # 1

    여기에는 별개의 세 가지 관련 개념이 있습니다 :

    <올>

    braced-init-list: 특정 상황에서 중괄호로 묶인 목록과 관련된 문법 규칙

    이니셜 라이저 목록 :list-initialization에서 사용되는braced-init-list이니셜 라이저의 이름

    std::initializer_list :braced-init-list와 관련된 일부 컨텍스트에서 생성 된 임시 배열을 래핑하는 클래스입니다.

    일부 예 :

    //a braced-init-list and initializer list, 
    //but doesn't create a std::initializer_list
    int a {4}; 
    //a braced-init-list and initializer list,
    //creates a std::initializer_list
    std::vector b {1, 2, 3};
    //a braced-init-list and initializer list,
    //does not create a std::initializer_list (aggregate initialization)
    int c[] = {1, 2, 3};
    //d is a std::initializer_list created from an initializer list
    std::initializer_list d {1, 2, 3};
    //e is std::initializer_list<int>
    auto e = { 4 };
    //f used to be a std::initializer_list<int>, but is now int after N3922
    auto f { 4 };
    
    

    auto 와 관련된 일부 규칙을 변경 한 N3922를 읽을 수 있습니다.  그리고 std::initializer_list

  • 답변 # 2

    중괄 초기 목록입니다. std::initializer_list 이전에braced-init-list가 존재했습니다  집계를 초기화하는 데 사용됩니다.

    int arr[] = {1,2,3,4,5};
    
    

    위는 배열을 초기화하기 위해braced-init-list를 사용했다.  생성됩니다. 반면에 할 때는

    std::initializer_list
    
    

    std::vector<int> foo = {1,2,3,4,5};  braced-init-listfoo 를 만드는 데 사용됩니다.  이것은 차례로 std::initializer_list 의 생성자로 전달됩니다.  그것은 foo 를 받아들입니다 .

    braced-init-list에 대해 알아 두어야 할 것은 유형이 없으므로 특별한 규칙이 사용되어 std::initializer_list 와 함께 사용된다는 것입니다 . N3922를 채택한 이후 다음과 같은 동작이 있습니다.

    auto
    
    

    이 동작의 이력과 그 변경 이유에 대해 더 많은 정보를 얻을 수 있습니다 : 왜 자동 x {3}가 initializer_list를 추론합니까?

  • 답변 # 3

    auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int> auto x2 = { 1, 2.0 }; // error: cannot deduce element type auto x3{ 1, 2 }; // error: not a single element auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> auto x5{ 3 }; // decltype(x5) is int 와이즈 비즈 .

    정확하지 않습니다.

    와이즈 비즈

    I just thought that any time you did a curly-braced list you were creating an

    와이즈 비즈  부분은 intializer_list 가 아닙니다 . 객체 목록을 사용하여 다른 객체를 만드는 것은 단지 구문 형식 일뿐입니다.

    If that's not what's happening, what is a list in curly-braces?

    다시 한번, 그것은 배열을 만드는 구문 형태입니다.

    구문 형식의 이름은 struct Foo {int a; int b;}; Foo f = {10, 20}; 입니다. .

  • 답변 # 4

    {10, 20} 를 사용할 때 두 가지 다른 점이 있습니다

    <올>

    타입 initializer_list  여기서 값은 암시 적으로 int a[] = {10, 20, 30}; 로 변환 될 수 있습니다.

    목록의 값으로 초기화 할 수있는 유형

    첫 번째 유형은 동종 목록을 강제하고 두 번째 유형은 그렇지 않습니다. 다음 예에서 :

    braced-init-list
    
    
    f1과 f2 기능은 첫 번째 유형을 사용하고 f3은 두 번째 유형을 사용합니다. 모호성이있는 경우 std :: initializer_list가 선호됩니다. 예 :

    {}
    
    
    std::initializer_list<T>

관련 자료

  • 이전 bit shift - C에서 64 비트 변수 선언
  • 다음 language agnostic - 8 진법은 어떤 상황에서 사용됩니까?