C ++ 0X 표준이 C ++ 자동 다중 선언을 어떻게 정의합니까?

StackOverflow https://stackoverflow.com/questions/493401

  •  20-08-2019
  •  | 
  •  

문제

MMM, 다가오는 C ++ 0X 표준의 여러 자동 선언에 대해 약간의 혼란이 있습니다.

auto a = 10, b = 3.f , * c = new Class();

내가 읽은 곳은 허용되지 않습니다. 그 이유는 (?) 연속 선언이 동일한 유형의 첫 번째 유형을 가져야하는지 여부는 명확하지 않았기 때문입니다 (예제의 int).

가능한 번역 1 :

int a = 10; 
int b = 3.f; 
int * c = new Class ();

오류를 유발합니다

가능한 번역 2 :

int a = 10;
float b = 3.f;
Class * c = new Class (); 

표준이 어떻게 발생합니까?

내 POV를 말할 수 있다면, 번역 #2는 가장 OBIOUV였습니다. 적어도 나는 일반 C ++ 사용자입니다. 내 말은, "선언 된 모든 변수는 동일한 선언 된 유형입니다", 마녀는 자동입니다. 번역 #1은 나에게 직관적이지 않을 것입니다.

바이 바이 QBProg

도움이 되었습니까?

해결책

아마도 최신 것은 아니지만 2008 년 6 월의 C ++ 0X Draft 표준은 다음을 수행 할 수 있다고 말합니다.

auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int

따라서 6 월부터 무언가가 바뀌지 않는 한 이것은 매우 직관적 인 해석으로 제한된 형태로 허용됩니다.

제한 사항은 이와 같은 여러 자동 선언 (위의 예제 사용)을 문자하려는 경우 유추 된 유형의 유형이기 때문에 작동한다는 것입니다. v 그리고 u 부정확 한 용어를 사용하기 위해 동일한 '기본 유형'(이 경우 int)이 있습니다.

정확한 규칙을 원한다면 표준 초안은 다음과 같이 말합니다.

선언자 목록에 하나 이상의 선언자가 포함 된 경우, 각 선언 된 변수의 유형은 위에서 설명한대로 결정됩니다. 템플릿 매개 변수 u에 대해 추론 된 유형이 각 공제에서 동일하지 않은 경우 프로그램은 잘못 형성됩니다.

여기서 "추론 된 템플릿 매개 변수 u"는 다음과 같이 결정됩니다.

다음 발명 된 함수 템플릿의 호출 f (expr)에서 매개 변수 u의 추론 된 유형 :

 `template <class U> void f(const U& u);`

왜 그들이 다음과 같은 말을하는 대신이 규칙을 생각 해낸 이유 :

auto a = 10, b = 3.f , * c = new Class();

다음과 같습니다.

auto a = 10;
auto b = 3.f;
auto * c = new Class();

모르겠어요. 그러나 나는 컴파일러를 쓰지 않습니다. 아마도 당신이 auto 키워드가 대체되면 동일한 문서에서 변경할 수 없습니다.

예를 들어 :

int x = 5;
CFoo * c = new CFoo();

auto  a1 = x,       b1 = c; // why should this be permitted if
int   a2 = x, CFoo* b2 = c; // this is not?

어쨌든, 나는 어쨌든 같은 진술에 여러 선언을하는 팬이 아닙니다.

다른 팁

그만큼 초안 표준 섹션 7.1.6.4는 가능한 번역 2와 같은 유형을 혼합 할 수 없음을 의미합니다. 따라서 가능한 번역은 유효하지 않습니다.

현재 문구에 기여하는 데 도움이되는 점은 거의 없습니다. 첫 번째는 일관성입니다. 다음과 같은 선언을 작성하는 경우

int j;
int i = 0, *k = &j;

그런 다음 두 가지 유형이 모두 사용됩니다 int 그들의 유형 어딘가. 예를 들어 'J'가 'const int'인 경우 오류입니다. was 자동 동일한 작업은 그러한 선언에 대한 현재 모델과 "일관성"입니다.

그런 다음 컴파일러 작가의 관점에서 실질적인 이점이 있습니다. 컴파일러의 기계가 이미 존재합니다. 자동 운영으로 설명됩니다). 위 규칙은 템플릿 매개 변수에 대한 공제가 동일한 유형을 초래해야한다는 규칙과 일치합니다.

template <typename T> void foo (T, T*);

void bar ()
{
  int i;
  const int j = 0;

  foo (i, &i);  // OK deduction succeeds T == int
  foo (i, &j);  // ERROR deduction fails T == int or const int.
}

쉬운 구현 자동 기존 메커니즘을 재사용하여 유형을 추론하는 것입니다. 자동, 그리고 현재 행동과의 일관성 때문에 결과는 사람들에게 너무 놀라운 일이 아닙니다.

마지막으로, 이것은 아마도 내 의견에서 가장 중요한 요점 일 것입니다. 현재 모델은 보수적이며 C ++의 기존 언어 구성과 매우 유사하게 작동합니다. 따라서 쇼를 막을 가능성은 언어 버그를 막을 가능성이 매우 얇습니다. 그러나 현재 모델을 미래에 쉽게 확장하여 질문에 나열된 다른 예제를 포함 할 수 있습니다.

또한, 확장은 현재의 문구를 사용하는 코드를 깨뜨리지 않을 것입니다. 자동. 그들이 다른 방식으로 이것을했는지 고려하십시오. 확장 된 버전 인 경우 자동 첫 번째 버전이었고, 이로 인해 키워드에 대한 이상하고 치명적인 결함이 발생 했으므로 표준에서 언어 기능을 제거해야합니다. 코드를 깨뜨릴 가능성이 거의 없기 때문에 거의 일어나지 않습니다.

첫 번째는 다음과 같은 종류의 유형에서 유형의 추론이 어떻게 작동 하는가? : 연산자.

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