2015-01-14 4 views
4

C++ 11에서는 생성자를 상속하여 래스터 클래스와 같은 것으로 많은 상투적 인 표현을 피할 수 있습니다. 그러나 variadic 템플릿만으로이 기능을 이미 구현할 수있는 것처럼 보입니다.생성자 상속 vs 전달

class B 
{ 
public: 
B(int){//do something} 
B(int, char){//do something} 
}; 

사용 상속 생성자 :

class D : public B 
{ 
public: 
using B::B; 
}; 

앞으로 가변 인자 템플릿과 사용 : 일관성 (치료 생성자 및 방법 using에 대해 동일한 방법) 및 사용의 용이성이 매우하지만

class D : public B 
{ 
public: 
template <typename...Args> 
D(Args&&... args) : B(std::forward<Args>(args)...) 
{ 
} 
}; 

을 상속 된 생성자를 가져 오는 좋은 이유는 왜 첫 번째 솔루션을 두 번째 솔루션보다 우선 사용해야하는 다른 이유가 있을까요? 모두 CWG 문서 (N1890N1898는) 내가 상속 생성자는 단순히 다음 사항에 유의하고 이동 논의 발견

역사적 사고보다는 더 많은 일반 회원의 생성자뿐만 아니라 으로 작동하려면이 옵션을 사용 방지 리틀 기능. 생성자가 해당 클래스의 이름으로 참조되기보다는 "ctor"또는 "생성자" 이라면 이는 효과가있었습니다. 우리는 생성자를 상속하는 메커니즘으로 이것을 제안합니다.

+1

가능한 중복 (곱하지 않습니다 사용하는 동안) 또한

struct Base { Base(int) {} }; struct Derived : public Base { using Base::Base; }; struct DerivedTemplate : Base { template <typename...Args> DerivedTemplate(Args&&... args) : Base(std::forward<Args>(args)...) {} }; int main() { // error: no matching function for call to ‘Derived::Derived(int, int)’ Derived d(1, 2); // In instantiation of ‘DerivedTemplate::DerivedTemplate(Args&& ...) [with Args = {int, int}]’: // required from here // error: no matching function for call to ‘Base::Base(int, int)’ DerivedTemplate dt(1, 2); } 

는 각 템플릿 인스턴스는 다른 생성자이다 방법 유용한 상속 컨스트럭터는 C++에 있을까요?] (http : // stackoverflow. – Pradhan

답변

4

큰 이유는 완벽한 전달이 완벽하지 않다는 것입니다. 간단한 경우 :

struct B { 
    B(int*) { .. } 
}; 

지금 생각 : 우리가 생성자를 상속하는 경우

D d{0}; 

, 이것은 잘 작동합니다. 우리가 완벽하게 진행한다면 0은 존재하지 않는 생성자 인 int으로 추론하기 때문에 B(int)을 생성하려고 시도 할 것입니다. 실패!

다른 실패 사례에는 괄호 초기화, 선언 전용 정적 데이터 멤버, 오버로드 된 함수 및 비트 필드가 포함됩니다. '사용'

+5

부수적으로 이것은 포인터의 초기화 자로 정수 리터럴을 사용해서는 안되는 이유 중 하나이다. 단지'nullptr'입니다. – Columbo

3

완벽한 전달은 완벽하지 않습니다. 특히 실제 인수로 0을 사용하면 일반 null 값을 나타내는 대신 int이됩니다. 따라서 포인터 인수를 취하는 생성자의 경우 0은 상속 된 생성자의 실제 인수로 작동하지만 전달의 경우에는 작동하지 않습니다.

제가 생각하기에 질문 (우리가 정말로 생성자를 상속 받아야하는지)이 방영되었을 때 한 번 언급 한 또 다른 이유는 상속되는 생성자가 개념적으로 간단한 것에 대한 간단한 표기이며, 간단한 수업. 강제적 인 복잡성과 강제적 인 보편성이 C++에서 충분히 있습니다.

2

유지 보수 문제 (컴파일러 오류)의 선호로 이어질 수 있습니다의