문제

아래 코드는 컴파일하지만 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)는 구현의 기본 문자 세트의 구성원을 저장할만큼 충분히 커야합니다. 이 세트의 문자가 문자 객체에 저장되면 해당 문자 객체의 적분 값은 해당 문자의 단일 문자 문자 형식의 값과 같습니다. a char 객체는 음수 값을 보유 할 수 있습니다. 문자는 명시 적으로 선언 할 수 있습니다 unsigned 또는 signed. 솔직한 char, signed char, 그리고 unsigned char 세 가지 유형입니다.char, ㅏ signed char, 그리고 unsigned char 동일한 양의 저장소를 차지하고 동일한 정렬 요구 사항을 갖습니다 (기본. 타입); 즉, 그들은 동일한 객체 표현을 가지고 있습니다. 문자 유형의 경우 객체 표현의 모든 비트가 값 표현에 참여합니다. 서명되지 않은 문자 유형의 경우 값 표현의 가능한 모든 비트 패턴은 숫자를 나타냅니다. 이러한 요구 사항은 다른 유형의 경우에도 적용되지 않습니다. 특정 구현에서 평원 char 객체는 signed char 또는 unsigned char; 어느 것이 구현 정의 된 지.

다른 팁

이와 같은 질문의 경우 C ++ 미스터리에 대한 답변을 제공하는 C의 근거 문서를 살펴보고 표준을 읽을 때 때때로 발생합니다. 이것에 대해 말할 수 있습니다.

세 가지 유형의 숯이 지정되어 있습니다 : 서명, 평범한 및 서명되지 않은. 평범한 숯은 구현에 따라 사전 관행에서와 같이 서명하거나 서명되지 않은 것으로 표현 될 수 있습니다. Signed Char 유형은 서명되지 않은 Plain Char를 구현하는 시스템에서 1 바이트 서명 정수 유형을 이용할 수 있도록 도입되었습니다. 대칭의 이유로 서명 된 키워드는 다른 적분 유형의 유형 이름의 일부로 허용됩니다.

c

대부분의 적분 유형은 다음과 같습니다 short 그리고 int 존재에 대한 기본값 signed, char C ++에는 기본 간판이 없습니다.

C ++ 프로그래머가 사용할 때 발생하는 것은 일반적인 실수입니다. char 8 비트 정수 유형으로.

맞습니다, char, unsigned char 그리고 signed char 별도의 유형입니다. 아마도 좋았을 것입니다 char 어느 쪽도 동의어였습니다 signed char 또는 unsigned char 컴파일러 구현에 따라 표준은 별도의 유형이라고 말합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top