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

 
fxsaber :

두 옵션을 모두 컴파일해야 하는 이유는 무엇입니까?

일반적으로 템플릿을 거의 사용하지 않습니다. 자세한 내용은 다루지 않았습니다. 직관적인 수준에서만 설명할 수 있습니다.

두 번째 경우에 T를 A *로 직접 교체하면 정상적으로 컴파일됩니다. 이는 템플릿이 컴파일되어야 함을 의미합니다.

 class A {};
void f( A * const ) {}
void OnStart ()
{
        A *a;
        f( a ); //нормально
}

첫 번째 경우에는 직접 교체가 작동하지 않지만 중복 T2 매개변수를 추가할 수 있습니다. 이 매개변수와 함께 정상적으로 컴파일됩니다. 이는 매개변수가 없어야 함을 의미합니다. 이것이 중복되는 이유입니다.

 template < typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart ()
{
         const A *a;
        f( a, a ); //нормально
}
 
A100 :

직관적으로 const는 유형의 일부이고 때로는 식별자일 뿐이므로 함수 내부에서 포인터는 const가 됩니다.

이것은 Print (__FUNCSIG__)를 통해 느낄 수 있습니다.

 
드로다운 값이 최적화 테이블에 어떻게 표시되는지 이상합니다. 수단에 의한 최대 감소가 표시됩니다(그러나 백분율로 작성됨). 그리고 단일 테스트 후에 상대 감소가 최대값과 다른 것으로 나타났습니다(백분율은 더 크거나 작음). 자금 관리를 사용할 때 원하는 결과를 표시하기 위해 무언가를 추가해야 합니까?
 
A100 :

컴파일 중 오류

 template < typename T>
void f( T, const T ) {}
class A {};
void OnStart ()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
따라서 원래 버전은 컴파일되지 않아야 합니다.
 
Комбинатор :
따라서 원래 버전은 컴파일되지 않아야 합니다.

왜요?

 template < typename T>
struct B {
         void f( T, const T ) {}
};
class A {};
void OnStart ()
{
           const A* a;
        B< const A*> b;
        b.f( a, a ); //нормально
}

그래서 괜찮습니다. 근본적으로 달라진 점은 무엇입니까?

 template < typename T>
        void f( T, const T ) {}
class A {};
void OnStart ()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100 :

근본적으로 달라진 점은 무엇입니까?

차이가 큽니다! 여기 당신이 부른 것입니다

 void B< const A*>::f( const A*, const A*)
컴파일러는 템플릿의 필요한 올바른 버전을 추측할 수 없다는 점에서 버그가 있습니다. 분명히 그에게 말했다
 template < typename T>
         void f( T, const T ) {}
class A {};
void OnStart ()
{
           const A *a;
          f < const A*> ( a, a );
}

그리고 모든 것이 효과가 있었습니다.

 
fxsaber :
그리고 모든 것이 효과가 있었습니다.

왜 추가 문자?

 
A100 :

왜 추가 문자?

컴파일러가 템플릿의 완전히 작동하는 버전을 추측하지 않는다는 것을 보여줍니다.

 
fxsaber :

컴파일러가 템플릿의 완전히 작동하는 버전을 추측하지 않는다는 것을 보여줍니다.

무엇 때문에? ServiceDesk는 스스로 알아낼 수 있습니다.

 
A100 :

왜요?

전문화로 판단하면 유형은 완료되는 const를 버려야 합니다. 물론 원하는 유형을 명시적으로 표시하면 컴파일됩니다.