큰 포인터를 원시 포인터 대신 사용자 지정 공유 포인터를 사용하도록 변환 중입니다. 과부하 해결에 문제가 있습니다. 이 예제를 고려하십시오 qualification conversions는 암시 적 변환 시퀀스의 순위에 중요한 역할을하기 때문에오버로드 해결 및 const3200에 대한 공유 포인터
는#include <iostream>
struct A {};
struct B : public A {};
void f(const A*)
{
std::cout << "const version\n";
}
void f(A*)
{
std::cout << "non-const version\n";
}
int main(int, char**)
{
B* b;
f(b);
}
이 코드는 제대로 "const가 아닌 버전"을 씁니다. 이제 shared_ptr을 사용하여 버전을 살펴보십시오.
#include <iostream>
#include<memory>
struct A {};
struct B : public A {};
void f(std::shared_ptr<const A>)
{
std::cout << "const version\n";
}
void f(std::shared_ptr<A>)
{
std::cout << "non-const version\n";
}
int main(int, char**)
{
std::shared_ptr<B> b;
f(b);
}
이 코드는 함수 호출이 모호하기 때문에 컴파일되지 않습니다.
user-defined deduction-guide은 해결책이 될 수 있지만 여전히 Visual Studio에는 존재하지 않는다는 것을 알고 있습니다.
수천 개의 호출이 있기 때문에 regexp를 사용하여 코드를 변환하고 있습니다. 정규 표현식은 const 버전과 일치하는 호출을 비 const 버전과 일치하는 호출과 구별 할 수 없습니다. 공유 포인터를 사용할 때 과부하 해결을보다 세밀하게 제어 할 수 있으며 수동으로 각 호출을 변경하지 않아도됩니까? 물론 원시 포인터를 .get() 할 수 있고 호출에서 사용하지만 원시 포인터를 모두 없애고 싶습니다.
@ πάνταῥεῖ 무료 함수 오버로드입니다. 멤버 함수가 전혀 포함되어 있지 않습니다. –
"물론 원시 포인터를 가져 와서 호출에서 사용할 수 있지만 원시 포인터를 모두 없애려고합니다." 원시 포인터를 높이는 것이 반드시 최선의 행동 과정은 아닙니다. 많은 경우, 컨테이너가 해당 인스턴스에 대한 메모리 액세스로 지역을 감소시키기 때문에 원시 포인터는 'shared_ptr'보다 훨씬 더 성능이 좋습니다. 시간이 있다면 [Herb Sutter의 스마트 포인터 매개 변수 게시] (https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/)를 확인하시기 바랍니다. – cyberbisson
@cyberbisson 당신은 당연한 일입니다. 그러나 많은 사람들이 원시 포인터를 사용하여 많은 사람들이 지나가는 혼란 상태에서 코드를 구하기 위해 공유 포인터가 필요합니다. 그리고 일부 주문에 대해서는 적은 비용을 지불 할 용의가 있습니다. 링크를 주셔서 감사합니다, 나는 언제든지 상수 참고로 공유 포인터를 전달합니다. –