최근 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]입니다. 명시 적으로 표시되지 않은 변환 생성자가 여러 개 필요하지만 기본 생성자는입니다.
게시물을 올리 자마자 나는 설명을 생각해 냈습니다. 그러나 나는 의심의 여지가있을 때까지 기다릴 것입니다. 왜냐하면 이것이 어쨌든 유용한 질문 인 것 같기 때문입니다. –