> 백엔드 개발 > C++ > 함수 템플릿과 같은 클래스 생성자에 대해 C 템플릿 매개변수를 추론할 수 없는 이유는 무엇입니까?

함수 템플릿과 같은 클래스 생성자에 대해 C 템플릿 매개변수를 추론할 수 없는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-08 17:44:12
원래의
201명이 탐색했습니다.

Why Can't C   Template Parameters Be Inferred for Class Constructors Like Function Templates?

클래스 생성자 템플릿 추론 논쟁

템플릿 매개변수는 다음 코드와 같이 함수 인수에서 편리하게 추론할 수 있습니다.

template <typename T>
void swap(T& a, T& b) {
  T temp = a;
  a = b;
  b = temp;
}
로그인 후 복사

그러나 클래스 생성자에는 유사한 접근 방식이 허용되지 않아 C 사이에서 의문이 제기되었습니다. 프로그래머. 왜 안 되겠습니까?

이러한 불일치의 원인은 객체 구성의 복잡성에 있습니다. 생성자는 클래스의 유일한 진입점이 아닙니다. 복사 생성자와 할당 연산자도 중요한 역할을 하며 생성자에서만 템플릿 매개변수를 추론하면 모호성이 발생할 수 있습니다.

다음 예를 고려하세요.

template <typename T>
class Variable {
  T data;
public:
  Variable(T d) { data = d; }
};
로그인 후 복사

템플릿 추론이 허용된 경우 다음 코드는 유효합니다:

Variable var(2); // Equivalent to Variable<int> var(2);
로그인 후 복사

그러나 복사 구성이나 할당을 사용하면 어떻게 될까요? 연산자?

MyClass m(string s);
MyClass *pm;
*pm = m;
로그인 후 복사

이 경우 컴파일러가 MyClass pm의 템플릿 유형을 결정하는 것이 어려울 수 있습니다.

이 문제를 완화하기 위해 C 17에서는 생성자 인수에서 유형 추론을 도입했습니다. . 이를 통해 생성자 매개변수에서 템플릿 매개변수를 추론할 수 있으므로 특정 상황에서 명시적인 유형 인수가 필요하지 않습니다. 예:

std::pair p(2, 4.5); // Inferred as std::pair<int, double> p(2, 4.5);
std::tuple t(4, 3, 2.5); // Inferred as std::tuple<int, int, double> t(4, 3, 2.5);
로그인 후 복사

이 추론 기능은 아직 개발 중이며 향후 C 표준에서 수정될 수 있다는 점에 유의하는 것이 중요합니다. 그럼에도 불구하고 이는 코드를 단순화하고 유형 안전성을 향상시키는 데 있어 중요한 진전입니다.

위 내용은 함수 템플릿과 같은 클래스 생성자에 대해 C 템플릿 매개변수를 추론할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿