문제

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 함수의 반환 값이기 때문에 표준은 해당 사본을 명시 적으로 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top