오류, 버그, 질문 - 페이지 2419

 
Alexey Navoykov :

언어에 r-값 으로 인수를 전달하는 기능을 추가하는 것에 대해 어떻게 생각하십니까? 이렇게 하면 모든 문제가 즉시 해결되고 모든 유형에 대한 범용 컨테이너를 만들 수 있습니다.

처럼? ) 범용 컨테이너의 경우 링크와 화살표가 필요하지만 그게 다가 아닙니다.

여기에서 일반 사용자는 r-value를 수행하는 사람이 아닙니다.

 
Alexey Navoykov :

언어에 r-값 으로 인수를 전달하는 기능을 추가하는 것에 대해 어떻게 생각하십니까? 이렇게 하면 모든 문제가 즉시 해결되고 모든 유형에 대한 범용 컨테이너를 만들 수 있습니다. 특히 위의 방법은 r-값에 대해 오버로드됩니다.

이것은 정확히 모든 STL 컨테이너에서 구현되는 것입니다.

그리고 두 번째 플러스: 이동 생성자 를 설정할 수 있습니다. 이제 이것은 특히 unique_ptr 스마트 포인터 및 자체 내부에 특정 고유 리소스를 독점적으로 저장하도록 설계된 기타 클래스의 구현에 대해 매우 부족합니다. 일반 복사 생성자는 허용되지 않습니다.

그러면 참조로 매개변수를 전달하는 요점은 무엇입니까?

 
Slava :

그러면 참조로 매개변수를 전달하는 요점은 무엇입니까?

당신은 매우 이상한 질문을합니다. r-값 참조는 순전히 이동 의미론을 위한 것입니다. 다른 모든 것에 대한 일반 링크.
 
Slava :

그러면 참조로 매개변수를 전달하는 요점은 무엇입니까?

어떤 링크를 말씀하시는지 잘 모르겠습니다. 처음에는 l-값 참조(MQL에서 사용 가능)가 모든 요구 사항을 충족하지 못한다는 이야기가 있었는데, 이는 상수 또는 표현식 값을 그러한 함수에 전달할 수 없음으로 입증되었습니다. 이러한 목적을 위해 다른 모든 유형을 허용하는 r-값 참조가 필요합니다. 따라서 r-값과 l-값에 대해 두 개의 오버로드된 함수를 조합하면 출처에 관계없이 모든 유형의 인수가 허용됩니다.

상수는 어디에도 저장되지 않고 즉석에서 생성된다고 말씀하셨는데, 이는 (C ++와 달리) l-value가 아닌 r-value로 전송되어야 함을 의미합니다. 어떤 형태로 해석되는지에 근본적인 차이는 없으며, 가장 중요한 것은 함수에서 받아들일 수 있다는 것입니다.

 
Alexey Navoykov :

상수는 어디에도 저장되지 않고 즉석에서 생성된다고 말씀하셨는데, 이는 (C ++와 달리) l-value가 아닌 r-value로 전송되어야 함을 의미합니다. 어떤 형태로 해석되는지에 근본적인 차이는 없으며, 가장 중요한 것은 함수에서 받아들일 수 있다는 것입니다.

음, 실제로 r-값 참조는 이동이 수행될 대상의 존재를 의미합니다. 저것들. 임시 개체는 모두 동일하게 생성되어야 합니다.

 
TheXpert :

음, 실제로 r-값 참조는 이동이 수행될 대상의 존재를 의미합니다. 저것들. 임시 개체는 모두 동일하게 생성되어야 합니다.

물론 그 물체는 항상 어딘가에 있습니다. 나는 이 객체가 즉석에서 생성된다고 썼습니다. 일시적인.

그러나 나는 Slava가 무엇을 요구했는지 이해하는 것 같습니다. 그는 임시 객체를 가치로 취할 수 있는데 왜 참조로 임시 객체를 취하는지 의미했습니다.

따라서 요점은 한 범위의 참조와 값에 대해 동시에 함수를 오버로드하는 것이 불가능하다는 것입니다.

 template < typename T>
 void f(T) { }
template < typename T>
 void f(T const &) { }
 
class A { };

void OnStart ()
{
  A a;
  f(a);
   const int b= 0 ;
  f(b);   // 'f' - ambiguous call to overloaded function with the same parameters
}

보편적인 솔루션을 작성하는 데 문제가 있습니다. 그리고 값을 r-값으로 바꾸면 작동하는 버전이 나옵니다.

 template < typename T>
 void f(T && ) { }
template < typename T>
 void f(T const &) { }
 
Alexey Navoykov :

그는 임시 객체를 가치로 취할 수 있는데 왜 참조로 임시 객체를 취하는지 의미했습니다.

왜냐하면

 void f( int ) {}
void f( const int &) {}

void OnStart ()
{
   const int x = 0 ;
   f(x); // 'f' - ambiguous call to overloaded function with the same parameters
}

그리고 일반적으로 값보다 참조로 무언가를 전달하는 것이 더 편리하기 때문입니다.

방법이 템플릿(술이 실제로 나간 것)인 경우 현재 동작은 단순히 정상적으로 쓰기를 허용하지 않습니다.

 
TheXpert :

방법이 템플릿(술이 실제로 나간 것)인 경우 현재 동작은 단순히 정상적으로 쓰기를 허용하지 않습니다.

예, 더 시각적으로 보기 위해 예제를 int로 대체했습니다.
 
Alexey Navoykov :

보편적인 솔루션을 작성하는 데 문제가 있습니다. 그리고 값을 r-value로 바꾸면 작동하는 버전이 나옵니다.

설마 )

이동 의미는 이동 중인 객체에 내부를 제거하지 않도록 지시하는 것을 포함합니다. 객체가 const이면 변경 가능한 클래스 멤버 가 필요하고 mql은 이를 지원하지 않습니다.

 
TheXpert :

설마 )

이동 의미는 이동 중인 객체에 내부를 제거하지 않도록 지시하는 것을 포함합니다. 객체가 const이면 변경 가능한 클래스 멤버 가 필요하고 mql은 이를 지원하지 않습니다.

예, 맞습니다. r-value에 대한 const는 설정할 필요가 없습니다(그렇게 잘 컴파일되지 않음). 지금 수정하겠습니다)