그의 CppCon 2014 탈크 에서 Scott Meyers는 auto
에 대한 특별한 규칙이 있고 왜 C++ 11/C++ 14 표준 (그의 질문은 at 36m05s이라고 시작합니다)에서 이니셜 라이저를 보강했는지에 대한 질문을 던집니다.C++ 11/C++ 14에서 자동 및 브레이스 이니셜 라이저를위한 특수 유형 공제 규칙이있는 이유는 무엇입니까?
braced-init-list와 결합 된 auto의 의미는 §7.1.6.4/6에 정의되어 있습니다.
나는 그것에 대해 생각하고 유스 케이스도 생각해 낼 수 없었다. 지금까지 본 것 중에 가장 가까운 것은 Bjarne Stroustrup이 사용했던 한 예입니다.
그는 Cpp 2014 talk "Make Simple Tasks Simple!"에서 auto
을 사용하여 이니셜 라이저를 캡처합니다 (단, 일시적인 해결책으로 만 사용 가능). 여기
// auto ss1 = collect({ 1, 2, 3, 4, 5, 6 }, odd); // error: Bummer!
auto lst = { 1, 2, 3, 4, 5, 6 };
auto ss2 = collect(lst, odd); // {1,3,5}
그러나 그것은 단지 해결 방법입니다 있습니다. 그는 그것이 필요하지 않아야한다고 언급했다. 대신 그는 함수에 인수를 직접 전달하는 것을 선호합니다. 따라서, auto
과 이니셜 라이저 목록에 대한 좋은 동기가 될 수는 없습니다. 그가 제안으로 C++의
나의 이해는, 비얀의 예에서 초기화-목록을 허용하는 단점을 판단 할만큼 깊은하지 않습니다. 어쨌든,이 경우에는 auto
의 필요성을 피할 수 있습니다.
그래서 auto
이고 이니셜 라이저 목록은 더 잘 해결되었을 수있는 해결 방법 일뿐입니다? 아니면 §7.1.6.4/6의 추가 자동 공제 규칙이 유용한 좋은 예가 있습니까?
template<class T> void inc(T, int); // (1) template<class T> void inc(std::initializer_list<T>, long); // (2) inc({1, 2, 3}, 3); // Calls (2). (If deduction had succeeded // for (1), (1) would have been called — a // surprise.)
그러나 auto
에 대한 특별한 예외를 조각 :
'auto x = {expr};을 만들려는'expr' (괄호 안의 쉼표 연산자 제외) 형식을 사용합니다. 그래도 전체 목록에 사용할 다른 유형을 모르겠습니다. – chris
@christ 나는 N3922를 의미한다고 생각합니다. Scott Meyers도 그렇게 언급합니다. Visual Studio는 C++ 14의 일부가 아니더라도 이미 구현합니다. 다음은 링크입니다. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3922.html –
아, 그 중 하나입니다. 이 사용법 때문에 나는 일반적인 종류에 동의하지 않아도된다. 그래도 형편없는 형식을 선호하고 이니셜 라이저 목록을 추가 선없이 함수에 전달할 수 있습니다. – chris