나는 생각도 다음과 같은 코드에 대한 정당성을 찾을 수 없습니다 :C++ 11 std :: initializer_list 생성자 오버로드 규칙이 존재하는 이유는 무엇입니까?
std::vector<int> a{1,2} // calls (7)
std::vector<int> a(1,2) // calls (2)
// constructors from http://en.cppreference.com/w/cpp/container/vector/vector
vector(std::initializer_list<T> init,
const Allocator& alloc = Allocator()); // (7)
explicit vector(size_type count,
const T& value = T(),
const Allocator& alloc = Allocator()); // (2)
다른 기능은 당신이 (()
대 {}
)을 사용하는 건축 방법에 따라 호출이 나에게 매우 비뚤어진 것 같다된다 . 왜 std::initializer_list
은 주어진 매개 변수와 완벽하게 일치하는 다른 기능보다 선호됩니까? 위의 입니다. 이 동작에 대해 볼 수있는 유일한 이점은 특정 값으로 컨테이너를 초기화 할 수 있으며 한 쌍의 중괄호 만 필요하다는 것입니다. 2
위의 생성자가 C++ 11에서 더 이상 사용되지 않는 것으로 알고 있습니다. 아마도이 변경으로 인해서도 여전히 추론 할 수 없습니다. 이유가 인 경우std::vector<int> a{1,2}
대 std::vector<int> a{{1,2}}
. 하지만, 최소한 이것은 분명히 모호함과 과부하 해결에 대한 변화를 초과하지는 않습니다. Effective Modern C++의 Scott Meyers에 따르면 std::make_unique
과 std::make_shared
은 (오버로드 해결로 인해) 인터페이스의 일부로 구성에 사용되는 양식을 명시 적으로 명시해야합니다. 그건 나에게 어리 석다.
나는 뭔가를 놓치고 있음을 인정하지만, 나는 확실하지 않다. 무엇입니다. 예를 들어 방금 std::vector
을 사용 했으므로이 기능에 대해 일반적으로 묻습니다.
그것은 동등하게 이상한 느낄 것'경우 표준 : : 벡터 {1,2,3}','표준 : : 벡터 {1,2,3,4}','표준 :: a {1,2,3,4,5};'모두 이니셜 라이저 목록 생성자를 호출하지만'std :: vector a {1,2};는 사용하지 않습니다. –
@ T.C. 그래서 나는'std :: initializer_list' 생성자에 우선권을주는 대신 std :: vector {{1,2,3}}'이어야한다고 주장 할 것입니다. –
user1520427
# 2가 더 이상 사용되지 않는다고 생각하는 이유도 모르겠습니다. 그렇지 않습니다. –