STL 쓸때 이동생성자, 이동할당자에 noexcept만 붙이면 어지간하면 이동될 줄 알았는데
컨테이너를 생성할 때 브레이스로 초기화를 하면 결국 복사 과정이 끼어들어가네요
Case B, Case C에서 벡터를 브레이스 초기화하므로 initializer_list가 생성되어야 하는데 여기에서 Foo 객체들의 복사를 피할 수가 없네요
initializer_list가 생성된 이후에 이동 생성자가 불리지 않는 이유는 copy elison 때문인 것 같고요
물론 위 예제처럼 Foo 객체가 벡터 밖에서 쓰일 일이 없다면 처음부터
v.emplace_back(0)
이런 식으로 바로 벡터 안에서 생성하는게 explicit constructor 하나만 호출될테니 가장 효율적이겠지만 실험을 위해 배제했어요
initializer_list 생성 후에 별다른거 안불리는 이유는 그런 이유가 아닐텐데..... initializer_list가 카피되도 underlying array는 카피되지 않는다는게 표준에 명시되어 있을걸? 딱 initializer_list 생성시에만 복사하고
c++14부터 underlying array의 라이프타임은 initializer_list의 최후의 복사본까지 보장되지만 그게 그 어레이를 복사해서는 아닐거임
맞음 그게 initializer_list 가 view 처럼 쓰기 위한 개념이라서 그랬던가 - return 0;