초기화 : t x (값) vs. t x = 값이 유형 t 일 때 값
-
08-07-2019 - |
문제
t x (값)는 일반적으로 값으로 x를 직접 초기화하는 반면 t x = 값은 값 유형에 따라 임시를 생성 할 수 있기 때문에 일반적으로 더 나은 선택입니다. 값이 T 형인 특별한 경우에, 내 추측은 표현 T x = value가 언제나 정확히 하나의 사본 생성자 호출을 만듭니다. 제가 맞습니까?
특히 값이 함수 호출의 결과 일 때 첫 번째 구문이 너무 추악하고 이해하기 어렵다고 생각하기 때문에이 질문을했습니다. 예 :
const std::string path(attributes.data(pathAttrib));
const std::string path = attributes.data(pathAttrib);
해결책
표준으로부터, CV-Unqualified 유형의 소스 유형이 대상의 도출 된 클래스와 동일하거나 직접 시작과 동일한 클래스 유형에 대한 사본 초기화는 직접 시작과 동일합니다. 이 두 경우에 대한 설명은 대상 유형에 대한 생성자 만 고려되고 선택된 생성자 만 인수로 대상을 초기화하는 데 사용되는 필요한 동작을 설명하는 단일 단락을 소개합니다.
이 경우에 추가 임시가 허용되지 않습니다.
초기화 형태는 12.8 [class.copy]에 설명 된 최적화가 발생하지 않도록합니다. 비 규범 적 예제이지만 12.8/15의 예제는 이니셜 라이저의 사본 초기화 형식을 사용하여 값으로 로컬 변수를 값으로 반환하는 함수로 인한 두 개의 사본의 제거를 보여줍니다. 이것은 IF를 의미합니다 value
예에서는 임시 유형이 있습니다 T
그런 다음 - 복사 작업이 작동합니다 x
- 제거 될 수 있습니다.
다른 팁
T x(value)
일반적으로 x 값으로 x를 직접 초기화하는 반면T x = value
값 유형에 따라 임시를 생성 할 수 있습니다.
당신은 거의 옳습니다. 더 나은 선택은 가장 명확한 구문입니다. 두 가지가 어떻게 다른지 다음과 같습니다.
초기화 형태 (괄호 사용 또는 =)는 일반적으로 중요하지만 초기화되는 엔티티가 클래스 유형을 가질 때 중요합니다 ... [8.5/11
struct A {
A(int) {}
};
struct B {
explicit B(int) {}
};
int main() {
{ A obj (42); } // succeeds
{ A obj = 42; } // succeeds
{ B obj (42); } // succeeds
{ B obj = 42; } // fails
}
암시 적 변환이 필요합니다 vector<int> v = 3;
실패하지만 틀린 것 같습니다 어쨌든, 맞아? 모든 사본이있을 수 있습니다 기타. 나는 이것이 내가 쓴 모든 것에서 병목 현상을 발견 한 것을 기억할 수 없으며 오래 전에 그것에 대해 걱정하지 않았다. 가장 명확한 구문을 사용하십시오.
값이 T 형인 특별한 경우에, 내 추측은 표현이
T x = value
항상 정확히 하나의 사본 생성자 호출을 초래합니다. 제가 맞습니까?
아니요, COPTOR가 항상 호출 될 것이라고 보장하지는 않지만 액세스 할 수 있어야합니다. 예를 들어, 위의 특정 사례에서 value
함수의 반환 값이기 때문에 표준은 해당 사본을 명시 적으로 사용할 수 있습니다.