2017-12-12 5 views
21

동안 , ssstd::string*을 사용하고 std::stringstream을 반환하는 함수에 대한 선언입니다.대부분의 성가신 구문 분석은 일부 C++ 03 코드를보고, 나는 나를 혼동 <em>가장 골치 아픈 구문 분석</em>의 인스턴스를 발견

std::string(argv[0])std::string*으로 어떻게 파싱됩니까?

직관적으로 나는 argv[0]argv에 대한 액세스라고 생각했습니다. 함수 선언의 맥락에서, 컴파일러 main에서 argv 그늘지게 (a 선언argv라는 함수 파라미터 같은 크기 0의 배열std::string argv[0] 같은 std::string(argv[0]) 해석하므로

+0

이 때문에

는 '는 argv [0]'타입 '명백하게 argv' 0의 배열 크기 때문에 비주얼 스튜디오 2015로 날 컴파일 못했다. argv [1]을 사용하면 같은 결과를 얻을 수 있습니다. 재미있는 질문. –

+4

나는'std :: stringstream ss (std :: string argv []);와 동일하다고 생각한다. 이것은'std :: stringstream ss (std :: string * argv);와 동일하다. –

+0

나는 하나의 지침이 있다고 생각한다. 그것은 하나라는 선언처럼 보인다. 그래서 @ FrançoisAndrieux가 당신의 인스턴스를 std :: string에서 작성한 것과 같이 인스턴스화가 아니라 std : strings 배열에 대한 선언을 대신합니다. – ExOfDe

답변

18

이유이며 이것은 다른 범위이기 때문에) 배열 - 포인터 - 감쇠에 의한 포인터와 같습니다.

따라서, std::stringstream ss(std::string(argv[0]));std::stringstream ss(std::string* argv);

편집과 같은 의미 : 올바르게 코멘트에 annotaded했기 때문에, 크기가 0 인 배열 선언이 잘못 형성 프로그램을 렌더링, C++에서 유효하지 않습니다. -pedantic 플래그 (GCC 및 clang)로이 코드를 컴파일하면 경고가 발행됩니다. Visual Studio도 컴파일 오류를 생성합니다. 0보다 다른 다른 배열 인덱스의 경우, 위의 인수는 여전히 유효합니다.

+1

그래서 가장 고뇌스러운 구문 분석은 내가 항상 생각한 것보다 훨씬 더 나빴습니다 ...그것은 단지 "함수 선언처럼 보이는 경우 함수 선언"뿐만 아니라 "만약 그것이 잘못된 함수 선언처럼 보이는 경우 함수 선언".... omfg – user463035818

+2

@ tobi303 : 문법을 들여다보십시오 . 이것은 배열을 대략'type name_optional [size_expression]'으로 정의하며, 0으로 평가되는 표현식에 대한 특별한 문법 규칙은 없습니다. C++의 표현식 평가가 Turing-complete이므로 _ 어렵습니다. – MSalters

+1

@ tobi303하지만 잘못된 선언은 아닙니다. C++에서 [변수 선언은 괄호 안에 변수 이름을 래핑 할 수 있습니다] (https://stackoverflow.com/questions/29675601/). 즉'int (x)'는'int x'와 같습니다. 이것이'std :: string (argv [0])'이이 문맥에서'std :: string argv [0]'으로 보여 질 수있는 이유이다. MVP를 피하기 위해'std :: string'을 제거하면됩니다 :'std :: stringstream ss (argv [0]);' –

7

"선언 구문은 표현 구문과 같습니다"원칙과 "배열"매개 변수가 포인터라는 사실에 기인합니다.

다음 배열 선언은 동일합니다 x[a], (x)[a](x[a]) 동등한 표현이기 때문에

int x[1]; 
int (x)[1]; 
int (x[1]); 

더 많거나 적은.

std::stringstream ss(std::string(argv[0])) 

       <=> 

std::stringstream ss(std::string argv[0]) 

       <=> 

std::stringstream ss(std::string* argv)