2017-11-05 6 views
3

auto 키워드는 코드를 단순화하기 위해 도입되었습니다. 특히 stl 컨테이너를 반복 할 때마다 루프를 반복 할 때마다 구문이 엉망인 std::vector<MyType>::iterator 구문을 사용하지 않아도보다 쉽고 멋지게되었습니다. 그러나 정확히 동일한 일을 수행 할 auto을 사용하지 않고 코드를 작성할 수있었습니다.'자동'없이는 사용할 수없는 기능 (특히 구조화 된 바인딩)이 있습니까?

std::tuple<int, int&> f(); 
auto [x, y] = f(); 

그래서, 두 가지 질문 :

  1. 내가 할 수있는 방법이 없다는 것을 수정 있습니까

    는 이제 특정 구조화 된 바인딩에 auto없이 특정 기능을 사용할 수 없습니다 (내 생각) (아직 구조화 된 바인딩 사용)을 사용하지 않고 [x, y]을 초기화 하시겠습니까? 명시 적으로 초기화하는 방법이 있습니까 : *explicit_type* [x, y] = f();?

  2. auto을 사용해야하는 다른 기능은 무엇입니까?
+1

글쎄, 항상 ['std :: tie'] (http://en.cppreference.com/w/cpp/utility/tuple/tie)는 고려해야합니다 ...하지만 일대일 방식이 아닙니다 예 : 그것은 표현이고 선언이 아닙니다. ... –

+0

여기에 정확하게 필요하지는 않지만'std :: map :: insert_return_type i = m.insert (...);와 같이 명시적인 타입이 도움이되지 않는 곳이 있습니다. – milleniumbug

+0

2 : 당신은 일반 람다를 계산 했습니까? ... –

답변

2

auto (아직 구조화 된 바인딩 사용)을 사용하지 않고 [x, y]을 초기화 할 수 없다는 점을 고치겠습니다.

네, 맞습니다. 예를 들어 here에서 볼 수 있듯이 문법은 다른 방법을 지정하지 않습니다.

auto을 사용해야하는 다른 기능은 무엇입니까?

고전적인 예는 있어야 (일반) 람다 식 :

auto lambda = [](auto&&...) { }; 

그러나 코멘트에 명시된 바와 같이,뿐만 아니라 다른 사례가있다

.

+0

이 함수는 잘 컴파일됩니다.'std :: function f = []() {};', 그래서 당신은 기술적으로 lambdas에'auto'를 사용할 필요가 없습니다. 나는 그것이 정말로 다른 두 가지이기 때문에 유효한 반례 일지는 모르겠다. std :: function을 사용하면 어떤 타입 변환이 진행됩니까? – Valentin

+1

글쎄, 그때 당신의 요점은 무엇입니까? 함수 템플릿을 만들면'auto'를 사용하지 않고 제네릭 타입으로 호출 할 수 있고 타입 삭제 방법을 구현할 수 있습니다. – Jodocus

+5

@Valentin 예. lambda는 그 자리에서 생성 된 functor의 벙어리 인스턴스입니다. 'std :: function'은 헤비급 타입 - 삭제 된 퍼포 노이드 래퍼입니다. 당신은 전자를 후자에 넣을 수는 있지만 그들은 결코 동등하지 않습니다. – Quentin

1

cppreference는 cv-auto는 이력서 자격을 갖춘 타입 지정자 2/를 들어 auto

나는 두 가지 예를 가능성이다 Structured binding declaration, C++17

attr(optional) cv-auto ref-operator(optional) [ identifier-list ] 

를 참조 점 1/와 관련된 매우 분명하다 :

    사용 예는 C++ 17 Declaring non-type template arguments with auto

이다

  • 이미 언급 auto = [](){}; 람다 경우

  • 다른 하나는 :

    C에서 단순화 될 수
    template <typename Type, Type value> constexpr Type TConstant = value; 
    

    ++ 17 : by :

    template <auto value> constexpr auto TConstant = value; 
    
  • 관련 문제