2016-10-29 2 views
2

다음 코드에 아무런 오류가없는 이유는 무엇입니까? 정확히 다음 코드 (기호 또는 형식의 별칭)에서 변수의 정의에 사용별칭 형식의 정교한 형식 지정자

using S = struct S; 

struct S {}; 

S s; 

int main() 
{ 
} 

느릅 나무 이름 : 유형 별칭 및 클래스의 이름은 정확히 같은 (컴파일러 clang)입니까?

using S = struct S {}; 

int main() 
{ 
    S s; 
} 
+0

단순히 중복

typedef struct C {} C; 

때문에 C와'형식 정의 구조체 S {} S;' –

+2

'using S = struct S; '는 숨기지 않지만 *'S'는 typedef 이름과 클래스 이름 (두 개의 속성을 가진 단일 이름)으로 재 정의합니다. 사람들은'S = struct S;를 사용하면 두 개의 이름이 나오고 C++은 여러 개의 "기호 공간"을 검색한다고 말하는 사람들이 종종 있습니다.하지만 C++에서는 작동하지 않습니다. 이에 대한 통찰력있는 토론은 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#407에서 확인할 수 있습니다. –

답변

2

아래 코드는 SS라는 구조체의 별칭 수 있습니다. using Sstruct S의 별칭으로 S이라는 이름을 다시 정의합니다.

using S = struct S; 

아래 줄은 struct S을 정의합니다.

struct S {}; 

아래 선언, S의 별칭으로를 사용하여 만든 같이 S을 이용한다.

S s; 

최소

코드가 인쇄됩니다이

using K = struct S; 

struct S { S(){ std::cout << "Constructed!\n"; } }; 

K s; 

int main() 
{ } 

에 가깝다, 대답 :

Constructed! 

기본적으로, 이름 Kstruct S로 대체됩니다. 두 번째 예를 들어


,로서의 본질적으로 같은 C의 typedef : C++

2
  1. 첫 번째 네임 태그 (구조체/연합/ENUM가) - 유형 이름 공간 (타입 정의 및 내장 타입)와는 완전히 C로부터 취한 것이다.
    규칙이 완화되어 typename-namespace에 아무 것도 없으면 태그 네임 스페이스가 자동으로 검색됩니다.

  2. 두 번째는 첫 번째에 대한 대답을 고려하여 대답합니다.
    typename이 있습니다.

+0

WRT 1.'# define'과 같이 별칭 기능을 입력 하시겠습니까? 그냥 텍스트를 대체합니까? – Orient

+0

그다지 좋아하지 않는다면 두 개의 다소 다른 네임 스페이스가 존재하지 않을 것입니다. 어쨌든, # 정의는 악합니다. – Deduplicator

+0

'S = struct S; using을 사용하면 컴파일러의 관점에서 두 개의 다른 룩업 테이블에 두 개의 이름이 생깁니 까? – Orient