2012-12-19 2 views
3

방지 암시 적 변환

wrapper x(2); 
x += -2; 
:이 작업을 수행하는 경우,

class wrapper 
{ 
private: 
    lib_type data; 
public: 

    wrapper() 
    { 
     lib_set_ui(this->data, 0UL); 
    } 

    wrapper (const wrapper &input) 
    { 
     lib_set(this->data, input.data); 
    } 

    wrapper (const long input) 
    { 
     lib_set_si(this->data, input); 
    } 

    wrapper (const unsigned long input) 
    { 
     lib_set_ui(this->data, input); 
    } 

    wrapper &operator+= (const wrapper &input) 
    { 
     lib_add(this->data, input.data); 
     return *this; 
    } 

    wrapper &operator+= (const unsigned long input) 
    { 
     lib_add_ui(this->data, input); 
     return *this; 
    } 
}; 

불행하게도 : 정말 필요가 없습니다 개체는이 같은 뭔가 결국 16,

컴파일러이 경우에, 그래서 ...

을 (GCC/VS2010)는 심지어 내가 암시 적으로 intunsigned long에 캐스팅하기 위해 노력하고있어 경고를 발행하지 않습니다, 그리고 내가 얻고 싶은 것을 확실히 아니다 , 내가 어떻게 wrapper 클래스에 대한 연산자를 오버로드 할 것이므로 필요하지 않을 때 임시 wrapper 개체를 만들 필요가 없습니까? 나는 wrapper &operator+= (const unsigned long input) 과부하를 제거 할 경우, 나는이 같은 것을 사용하는 것 :

wrapper x(2); 
x += wrapper(-2); 
x += -2;//implicitly casts -2 to wrapper 

하지만 난 컴파일러가 추가 개체를 최적화 할 수있을지도 모른다는 사실에 의존 할 수 있다고 생각하지 않습니다 ..

+0

나는 둘 다 사용하여'const long' parametred-version을 호출한다고 가정합니다. 계속해서 전환이 없을 수도 있습니다. –

+0

@EsaLakaniemi 나는 당신이 무슨 뜻인지 이해할 수 없다. –

+0

오, 이제 나는 이것을 올바르게 읽었다. 편집 : 오, 하나님 그냥 대답 질문을 멈추어야한다 나는 대답과 의견을 섞어 해요 –

답변

3

설명 할 때 암시 적 변환을 비활성화하는 방법을 모르겠습니다. 그러나 최소한 컴파일러에서 경고를 발행 할 수 있습니다.

gnu Mingw/gcc를 사용하는 경우 컴파일시 -Wconversion-Wsign-conversion을 전달하십시오. 위의 코드에 대한 경고가 표시됩니다.

MSVC의 경우 /Wall 또는 /W4을 사용하면 동일한 결과를 얻을 수 있습니다.

+0

'-Wsign-conversion'에 +1. 나는 그것이'-Wall' 또는'-Wextra'에 의해 가능하다는 것을 거의 확신했습니다. 당신은 안전을 위해'-Wall -Wextra -Wconversion -Wsign-conversion' 외에도 컴파일러에 보내야 할 다른 귀여운 경고 스위치를 알고 있습니까? Visual Studio에서 동일한 작업을 수행 할 수있는 방법이 있습니까? –

+1

@MihaiTodor : Visual Studio에서는 기본적으로 부호 변환에 대해 경고합니다. 그렇지 않은 경우 프로젝트 설정으로 이동하여 경고 수준을 더 높은 수준으로 설정할 수 있습니다. (3은 기본이라고 생각합니다.) –

+0

@MooingDuck'/ W4'에 가야만하는 것처럼 보입니다 만, 이것을 지적 해 주셔서 감사합니다! 정말 도움이됩니다. –