2013-07-09 1 views
1

basic_string 클래스에는 정적 const로 선언 된 npos가 있습니다. 이 C++ (11) 이후로 const 정적을 선언 왜 , 왜 안 간단하게 :C++ 11에서 std :: basic_string :: npos 선언

class basic_string{ 
    ................................ 

enum: size_type { npos = static_cast<size_type>(-1) }; 
.........................> 
}; 

???

좋은 정적 정적 또는 enum입니까?

+8

** 당신이 ** 열거 형이 더 좋다고 생각하는 이유는 무엇입니까? –

+0

정적 정적 변수는 선언뿐만 아니라 정의가 필요하기 때문에. 는 다음 코드해야 소스를 basic_string, 참조 : 템플릿 < ..... > const를 basic_string < ... > :: 말하자면 size_type의 basic_string <.....> :: 비영리; – Khurshid

+1

'npos'가'enum'이라면 주소를 가져올 수 없습니다. 그 주소를 찍은 일부 오래된 코드를 깰 수도; 아마도 그것이 'enum'으로 정의되지 않은 이유 일 것입니다. – Nawaz

답변

2

그렇게하지 않는 것이 좋은 이유가 있습니다. 열거 형은 오버로드를 해결하거나 템플릿을 인스턴스화 할 때 최소한 변경 사항을 발생시키는 새로운 유형을 만듭니다.

그렇다고해서 클래스 정의에서 클래스 정적 상수를 실제로 선언하고 정의 할 수 있다고 생각합니까? 아니면 클래스가 템플릿 일 때 규칙에 예외가 있습니까?

+0

템플릿에 대한 좋은 지적. 나는 그것이 특히 유용하다고 생각하지 않는다. 그러나'std :: string :: npos'가 열거 형이라면'std :: min (someString.size(), std :: string :: npos)'는 컴파일에 실패 할 것이다. –

0

두 가지 솔루션은 거의 같습니다. 대부분이 클래스 초기화에서 지원하지 않는 컴파일러 때문에 열거 형 해킹이 발생했습니다. 차이점은 다음과 같습니다. "변수"열거 형 주소를 사용할 수 없습니다. 정적 const 접근 방식은 유형 안전합니다. 자, C++ 11에서는 열거 형 클래스가 실제로 유형 안전합니다 (열거 형을 사용하는 경우는 예외).

기본적으로 유일한 차이점은 "주소"문제입니다. 하지만 enum 클래스를 정의 할 때는 유형을 정의해야합니다. 당신은 당신이 필요로하는 것이 상수 일 때 형식을 정의하는 것이 좋지 않다고 생각할 수도 있습니다.

+2

C++이 선언에서 이니셜 라이저를 지정할 수 없기 때문에 열거 형 해킹이 발생했습니다. 그것을 허락 한 표준 해킹은 사람들이 enum 해킹에 만족하지 못했기 때문에 정확하게 발명되었습니다 (잘못된 유형이 되었기 때문에). –

관련 문제