답변
두 가지 구문은 대부분의 상황에서 동일하며 선택할 대상은 대부분 취향입니다. 당신이 균일 초기화를하는 경우, 내가 뭘 제안 :
A a{ A{} };
을 그렇지 않으면 혼자 명확하게 할 수 있습니다 괄호 : 한 상황 (매우 가능성이 있음을,
A a((A())); // This can't be parsed as a function declaration
공지 사항, 내가 말을해야) 여기서 귀하의 질문에 표시된 두 양식은 동일하지 않습니다. 클래스 A
가 initializer_list<A>
를 사용하는 생성자가있는 경우 괄호를 사용하는 경우, 그 생성자는 복사 생성자를 통해 선호됩니다
#include <initializer_list>
#include <iostream>
struct A
{
A() { }
A(std::initializer_list<A> l) { std::cout << "init-list" << std::endl; }
A(A const& a) { std::cout << "copy-ctor" << std::endl; }
};
int main()
{
A a(A{}); // Prints "copy-ctor" (or nothing, if copy elision is performed)
A b{A()}; // Prints "init-list"
}
위의 차이는이 live example에 표시됩니다.
사실, 첫 번째 *는 "copy-ctor"를 인쇄하지 않습니다. 나는 그것의 복사 - elision 생각합니다. –
@MemyselfandI : 허, 맞아요, 컴파일러가 복사본을 삭제하고 있습니다.하지만 개념적으로 복사 생성자가 선택되었습니다. –
최적화가 활성화되었을 때만 복사 할 수 있습니까? –
대부분의 경우 그들은 동일하지만 A a{ A() };
은 std::initializer_list
생성자가있는 경우이를 선호하며 A a(A{});
은 이동/복사 생성자를 선호합니다.
생성자가 이동/복사 생성자를 호출하면 새로운 개체의 생성을 피할 수 있지만 std::initializer_list
생성자에서는 불가능합니다.
어느 구문도 함수 선언으로 파싱되지 않으므로 두 가지 모두 가장 난해한 구문 분석을 피할 수 있습니다.
#include <iostream>
#include <initializer_list>
struct A {
A() {
std::cout << "A()\n";
}
A(A&&) {
std::cout << "A(A&&)\n";
}
A(std::initializer_list<A>) {
std::cout << "A(std::initializer_list<A>)\n";
}
};
int main()
{
{A a{ A() };} // Prints "A()\n" "A(std::initializer_list<A>)\n"
{A a(A{});} // Prints "A()\n" and *possibly*
// (depending on copy elision) "A(A&&)\n"
}
- 1. 복잡한 계층 구조의 통일 초기화 구문?
- 2. {} 대신()을 사용할 C++ 0x의 통일 초기화?
- 3. C++ (11) 통일 초기화 코드 위
- 4. C++ (11) 통일 초기화 연타 ++ 작동하지 않습니다는
- 5. 배열 초기화 - 성능 차이
- 6. 배열 초기화 차이 자바
- 7. 초기화 사이의 차이 :
- 8. 차이 구문 분석에 REJECT
- 9. XML 구문 분석 차이
- 10. 가상 차이 구문 C++
- 11. 포인터 생성 차이 구문
- 12. SKAudioNode 차이 초기화 (fileNamed : 문자열) 초기화 사이 (URL : URL)
- 13. 통일 알고리즘 구현
- 14. 통일 그리드 행과 열
- 15. 무작위 통일 분포
- 16. 통일 엔진으로 SMS를 보내시겠습니까?
- 17. 프롤로그 통일 프로세스 (concat)
- 18. 목록 통합에 '통일'
- 19. 이자벨 형 통일/추론 오류
- 20. 스위프트의 문자열 보간과 문자열 초기화 사이의 차이
- 21. Clojure - 견적과 구문 견적의 차이
- 22. 내보내기 모듈의 반응 차이 구문
- 23. MAMP와 Ubuntu Server의 구문 차이
- 24. 하스 켈에서 통일 된 타입
- 25. OpenGL을 통일 버퍼 개체 (배열)
- 26. 통일 할 수있는 프롤로그 용어
- 27. 자바 스크립트 변수 초기화 구문
- 28. 목록 속성의 초기화 프로그램 구문
- 29. 생성자 체인 및 초기화 구문
- 30. 초기화
이 특별한 상황에서 가장 간단한 옵션은'A a;'입니까? 맞습니까? 만약 내가 이것을 오해하지 않는다면, 당신이 제안하는 구문은 A의 생성자에 전달하고자하는 임시가'A'와는 다른 타입 인 경우에만 의미가 있습니다. 맞습니까? 나는. 'A {B()}; '. – jogojapan