2010-05-14 8 views
27

최근 C++ 0x에 명시 적 기본 생성자를 요구하는 클래스를 발견했습니다. 그러나 기본 생성자를 암시 적으로 호출 할 수있는 시나리오가 필요하지 않습니다. 그것은 다소 무의미한 지정자처럼 보입니다. 나는 그것이 에 찬성하여 Class c;을 허용하지 않을 것이라고 생각했으나 그럴 것 같지 않습니다.명시 적 기본 생성자의 목적

는 C + +0 FCD의 일부 관련 인용, 그것은 나를 탐색 할 쉽게하기 때문에 유사한 텍스트가 아니라면 같은 장소에서, C++ 03의 존재]

12.3.1.3 [ class.conv.ctor]

기본 생성자는 명시 적 생성자 일 수 있습니다. 그러한 생성자는 디폴트 초기화 또는 값 초기화 (8.5)를 수행하는 데 사용됩니다.

명시 적 기본 생성자의 예제를 제공하기 위해 계속되지만 위에 제공된 예제를 간단히 모방합니다.

8.5.6은 [decl.init]

타입 T의 목적을 기본적으로 초기화하는 수단 :

- T가 (아마도 CV 수식) 클래스 타입 인 경우 (9 절) T의 기본 생성자가 호출됩니다 (T에 액세스 가능한 기본 생성자가없는 경우 초기화가 잘못됨).

8.5.7 [decl.init] 타입 T의 목적을 가치 초기화하는

의미 :

- T는 (아마도 CV 수식) 클래스 타입 (항 9)을 가진 경우 사용자 제공 생성자 (12.1)의 경우 T의 기본 생성자가 호출됩니다 (T에 액세스 가능한 기본 생성자가없는 경우 초기화가 잘못됨).

두 경우 모두 기본 생성자가 호출됩니다. 그러나 이것이 기본 생성자가 명시 적이 지 않은 경우 발생합니다. 완성도를 위해서 :

8.5.11 [decl.init] 더 초기화가 객체에 대해 지정되지 않은 경우

는, 객체가 기본 초기화이다;

내가 알 수있는 바로는, 이것은 단지 데이터가없는 변환을 남깁니다. 어느 것이 말이되지 않습니다.

void function(Class c); 
int main() { 
    function(); //implicitly convert from no parameter to a single parameter 
} 

하지만 분명히 그 기본 인수를 처리 ++ 방식 C는되지 않습니다 : 내가 가지고 올 수있는 최선은 다음이 될 것입니다. 이 Class();과 다르게 동작하게하는 다른 요소가 있습니까?

이 질문을 생성 한 구체적인 예는 std::function [20.8.14.2 func.wrap.func]입니다. 명시 적으로 표시되지 않은 변환 생성자가 여러 개 필요하지만 기본 생성자는입니다.

+0

게시물을 올리 자마자 나는 설명을 생각해 냈습니다. 그러나 나는 의심의 여지가있을 때까지 기다릴 것입니다. 왜냐하면 이것이 어쨌든 유용한 질문 인 것 같기 때문입니다. –

답변

21

이 명시 적 기본 생성자를 선언 경우

struct A { 
    explicit A(int a1 = 0); 
}; 

A a = 0; /* not allowed */ 
A b; /* allowed */ 
A c(0); /* allowed */ 

은 다음 예에서와 같이, 어떤 매개 변수가없는의 explicit 중복입니다.

A a = {}; /* error! */ 
A b{}; /* alright */ 

void function(A a); 
void f() { function({}); /* error! */ } 

그러나 FCD에서

, 그들은 changed this는 (비록 내가 의심 : 일부 C++ 0X 초안에서
struct A { 
    /* explicit is redundant. */ 
    explicit A(); 
}; 

은, 내가 그것을 n3035했다 생각, 그것은 다음과 같은 방법으로 차이를 만든 그들은이 세 가지 경우 모두 값 초기화 각각의 개체에서이 특별한 이유를 염두에 두지 않았습니다. 값 초기화는 오버로드 해결 댄스를 수행하지 않으므로 명시 적 생성자에서 실패하지 않습니다.

+0

오케이. 그러면'std :: function'에 대한 명시 적 생성자는 해당 초안 버전의 보류입니다. 이 설명을 마침내 질문을 작성한 후에 알아 냈지만 제공된 예제도'std :: function()'도 선택적 매개 변수를 사용하지 않았으므로 완전히 확신하지는 못했습니다. –

+0

이것은 약간 변경된 것으로 보입니다. [CWG 1518] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1518)을 참조하십시오. 최신 버전의 g ++ 및 clang ++는 C++ 11 모드에서도 기본값이 아닌 명시 적 기본 생성자에 대해'function ({}) '을 거부합니다. – dyp

+0

도 참조 http://cplusplus.github.io/LWG/lwg-defects.html#2510 –

관련 문제