초기화리스트 표현은 C++ 용기 초기화 정말 편리 연산 식 :전달 이니셜 라이저 목록
std::vector<int>({1, 2, 3})
를 ... 그러나 그것은 보인다 함수에 {1,2,3}
것이다 만 바인드 같은 중괄호로 둘러싸인 초기화리스트 표현,
template <class T>
void foo(T&& v)
{
std::vector<int>(std::forward<T>(v));
}
int main()
{
foo({1, 2, 3})
}
0,123,516 :
보편적 인 (전달) 참조에 결합하는 것 같지 않습니다 - 그는이
std::initializer_list<int>
소요
이 출력 :
test2.cpp:11:6: note: template<class U> void foo(U&&)
test2.cpp:11:6: note: template argument deduction/substitution failed:
test2.cpp:33:13: note: couldn't deduce template parameter ‘U’
(이 GCC 4.7.2와 결과였다.)
불행히도 이것은 우리가 초기화리스트 식을 전달할 수 있다는 것을 의미한다. 그렇게하는 것이 매우 편리 할 것이므로 왜 이것이 작동하지 않는지 묻고 싶습니다. 중괄호가 이니셜 라이저 목록 표현식을 전달 참조에 바인드 할 수없는 이유는 무엇입니까? 아니면이 허용되고, 아마도 내 컴파일러는 너무 오래 되었습니까?
'initializer_list'를 전달하는 것은 쓸모가 없습니다. 이미 참조 의미를 가지고 있으며 그 요소는 const이며, 따라서 움직일 수 없습니다. – dyp
이동 가능한지 여부는 중요하지 않습니다. 범용 전달 참조는 반드시 이동을 의미하지는 않으며 – Siler
과 같이 매개 변수를 따라 전달하는 것을 의미합니다. 예,하지만 braced-init-list에는 유형이 없습니다. 따라서, "있는 그대로"전달할 수는 없습니다. – dyp