char! = (서명 char), char! = (부호없는 char)
문제
아래 코드는 컴파일하지만 int 유형과는 다른 동작이 다릅니다.
특히
cout << getIsTrue< isX<int8>::ikIsX >() << endl;
cout << getIsTrue< isX<uint8>::ikIsX >() << endl;
cout << getIsTrue< isX<char>::ikIsX >() << endl;
int8, uint8 및 char의 세 가지 유형에 대한 템플릿의 3 가지 인스턴스화를 초래합니다. 무엇을 제공합니까?
ints : int 및 uint32에 대해서도 마찬가지는 동일하지 않습니다.
그 이유는 C ++가 Char, 서명 된 Char 및 signed char를 세 가지 다른 유형으로보고 있기 때문입니다. int는 서명 된 int와 동일합니다. 이게 옳거나 내가 뭔가를 놓치고 있습니까?
#include <iostream>
using namespace std;
typedef signed char int8;
typedef unsigned char uint8;
typedef signed short int16;
typedef unsigned short uint16;
typedef signed int int32;
typedef unsigned int uint32;
typedef signed long long int64;
typedef unsigned long long uint64;
struct TrueType {};
struct FalseType {};
template <typename T>
struct isX
{
typedef typename T::ikIsX ikIsX;
};
// This int==int32 is ambiguous
//template <> struct isX<int > { typedef FalseType ikIsX; }; // Fails
template <> struct isX<int32 > { typedef FalseType ikIsX; };
template <> struct isX<uint32 > { typedef FalseType ikIsX; };
// Whay isn't this ambiguous? char==int8
template <> struct isX<char > { typedef FalseType ikIsX; };
template <> struct isX<int8 > { typedef FalseType ikIsX; };
template <> struct isX<uint8 > { typedef FalseType ikIsX; };
template <typename T> bool getIsTrue();
template <> bool getIsTrue<TrueType>() { return true; }
template <> bool getIsTrue<FalseType>() { return false; }
int main(int, char **t )
{
cout << sizeof(int8) << endl; // 1
cout << sizeof(uint8) << endl; // 1
cout << sizeof(char) << endl; // 1
cout << getIsTrue< isX<int8>::ikIsX >() << endl;
cout << getIsTrue< isX<uint8>::ikIsX >() << endl;
cout << getIsTrue< isX<char>::ikIsX >() << endl;
cout << getIsTrue< isX<int32>::ikIsX >() << endl;
cout << getIsTrue< isX<uint32>::ikIsX >() << endl;
cout << getIsTrue< isX<int>::ikIsX >() << endl;
}
나는 g ++ 4.something을 사용하고 있습니다
해결책
표준의 답변은 다음과 같습니다.
3.9.1 기본 유형 [Basic.Fundamental
문자로 선언 된 개체 (
char
)는 구현의 기본 문자 세트의 구성원을 저장할만큼 충분히 커야합니다. 이 세트의 문자가 문자 객체에 저장되면 해당 문자 객체의 적분 값은 해당 문자의 단일 문자 문자 형식의 값과 같습니다. achar
객체는 음수 값을 보유 할 수 있습니다. 문자는 명시 적으로 선언 할 수 있습니다unsigned
또는signed
. 솔직한char
,signed char
, 그리고unsigned char
세 가지 유형입니다. ㅏchar
, ㅏsigned char
, 그리고unsigned char
동일한 양의 저장소를 차지하고 동일한 정렬 요구 사항을 갖습니다 (기본. 타입); 즉, 그들은 동일한 객체 표현을 가지고 있습니다. 문자 유형의 경우 객체 표현의 모든 비트가 값 표현에 참여합니다. 서명되지 않은 문자 유형의 경우 값 표현의 가능한 모든 비트 패턴은 숫자를 나타냅니다. 이러한 요구 사항은 다른 유형의 경우에도 적용되지 않습니다. 특정 구현에서 평원char
객체는signed char
또는unsigned char
; 어느 것이 구현 정의 된 지.
다른 팁
이와 같은 질문의 경우 C ++ 미스터리에 대한 답변을 제공하는 C의 근거 문서를 살펴보고 표준을 읽을 때 때때로 발생합니다. 이것에 대해 말할 수 있습니다.
세 가지 유형의 숯이 지정되어 있습니다 : 서명, 평범한 및 서명되지 않은. 평범한 숯은 구현에 따라 사전 관행에서와 같이 서명하거나 서명되지 않은 것으로 표현 될 수 있습니다. Signed Char 유형은 서명되지 않은 Plain Char를 구현하는 시스템에서 1 바이트 서명 정수 유형을 이용할 수 있도록 도입되었습니다. 대칭의 이유로 서명 된 키워드는 다른 적분 유형의 유형 이름의 일부로 허용됩니다.
대부분의 적분 유형은 다음과 같습니다 short
그리고 int
존재에 대한 기본값 signed
, char
C ++에는 기본 간판이 없습니다.
C ++ 프로그래머가 사용할 때 발생하는 것은 일반적인 실수입니다. char
8 비트 정수 유형으로.
맞습니다, char
, unsigned char
그리고 signed char
별도의 유형입니다. 아마도 좋았을 것입니다 char
어느 쪽도 동의어였습니다 signed char
또는 unsigned char
컴파일러 구현에 따라 표준은 별도의 유형이라고 말합니다.