지나치게 모호한 제목에 대해 유감스럽게 생각합니다 (영어 실력 부족). 더 나은 제목을 제안하십시오.왜 복사 생성자가 호출되지 않습니까?
다음 코드를 고려하십시오.
struct A {
typedef std::vector<double> State;
// template <class... Args>
// A(Args... args)
// : a(args...)
// {}
template <class... Args>
A(Args&&... args)
: a(std::forward<Args>(args)...)
{}
A(const A&) = default;
A(A&&) = default;
State a;
};
int main(){
A a(3,2);
A b = a; // This line triggers an error!!
}
GCC 4.8.0 오류 메시지 error: no matching function for call to 'std::vector<double>::vector(A&)' : a(std::forward<Args>(args)...)
와 함께 컴파일하지 못했습니다.
이 코드가 잘못된 이유를 이해할 수 없습니다. 제 생각에는 컴파일러는 라인 A b = a;
에 복사 생성자를 호출해야합니다.
그러나 생성자를 주석 처리 된 것으로 대체하면 (값을 단순히 취함). 그것은 컴파일됩니다. 게다가 기본 복사 (및 이동) 생성자에 대한 행은 필요하지 않습니다. 여기 어떻게됩니까?
오, 알았어요. 명확한 설명 주셔서 감사합니다. :) – Sungmin