2009-04-03 3 views
6

다음과 같은 몇 가지 코드가 나타났습니다.왜 당신은 과제의 lhs를 캐스팅하겠습니까?

enum BAR { /* enum values omitted */ } 

class Foo{ 
public: 
    void set(const BAR& bar); 
private: 
    uint32_t bits; 
}; 

void Foo::set(const BAR& bar) 
{ 
(uint32_t&)bits = bits | bar; 
} 

Foo :: set의 할당에서 C 스타일 캐스트의 요점을 이해하지 못합니다. 왜 당신은 과제의 lhs를 캐스팅하겠습니까? 미쳤나요? 아니면 목적이 있습니까?

+0

아마도 정밀도 손실에 대한 컴파일러 경고를 피할 수 있습니까? 나는 그렇게 확신하지 않는다. –

답변

8

이 경우 캐스팅되는 것은 캐스팅과 동일한 유형이므로 캐스팅에 대한 이유가 표시되지 않습니다. 일반적으로 특정 할당 연산자를 사용하도록 강제 할 수 있습니다.

필자의 코드에 캐스트가 포함되어 있으면 코드 또는 디자인에 문제가있을 수 있으므로 캐스트를 제거하기 위해 두 가지를 모두 검토해야합니다.

+0

예. 마지막으로 하나를 사용하여 Win32 API를 사용하고있었습니다. 코드에 뭔가 문제가있었습니다. 그것은 제가 아니 었습니다. 아마 15 년 전에 더 좋은 생각처럼 보였던 것들 중 하나 일 것입니다. –

+0

좋은 만트라에 +1. – bayda

-1

특정 값만 할당하도록 허용하려는 경우 (예 : 할당을 확인하는 작업은 rhs를 확장 한 것처럼 아무 것도 통과시키지 않고 캐스트마다 변수 유형을 입력하는 것처럼 처리됩니다).

0

BAR이 uint32 범위를 벗어난 값으로 정의 되더라도 아무 것도하지 않습니다. 나에게 소음처럼 보입니다.

2

Neil Butterworth와 동의합니다.이 경우 캐스트는 필요하지 않으며 명확한 "코드 냄새"입니다.

0

배경을 모르면 확실하게 말할 수는 없지만 누군가 기존의 C 코드를 가져 와서 C++ 클래스로 래핑 한 것처럼 보입니다. 캐스트는 C 코드의 나머지 부분 일 수 있습니다.

0

확실하지 않습니다. 캐스트는 lvalue가 아닙니다 ...

어느 쪽이든, 그것은 상당히 무의미 해 보입니다.

관련 문제