2012-06-26 2 views

답변

11

번호 ++ 프로그램은 argv 인자가 존재 한 경우, const 개질제가 없다.

편집 : 항을 참조 (버전에서 나는 내 앞에있는)을 C++ 11 표준 초안의 3.6.1.2 상태 :

구현의 주요 기능을 미리 정의하지 않는다. 이 함수 은 오버로드되지 않습니다. 그것은 int 타입의 리턴 타입을 가지지 만, 그렇지 않으면 그것의 타입은 구현 - 정의된다. 모든 구현 메인의 다음과 같은 정의를 모두 허용해야한다 :

int main(){ /*...*/ }

3

int main(int argc, char* argv[]) { /* ... */ }

당신이 휴대용으로 무엇을 의미하는지에 따라 다릅니다. 악의적 인 C++ 구현은 서명 ( int(int,char const*const*))이 필수 허용 시그니처 중 하나 인 int()int(int,char**)과 다르다는 이유로 거부 할 수 있습니다. 악의적 인 구현은 겉으로보기에는 auto main(int argc,char* argv[]) -> int을 거부 할 수 있습니다. 실제로 신체가 이 아닌 main의 정의를 거부 할 수 있습니다.

그러나 이것은 일반적이지 않습니다. const를 추가하면 main을 호출하는 문제가 발생하고 C++ 11은 char const * const *을 통해 char** 객체에 액세스 할 때 엄격한 앨리어싱 규칙을 위반하지 않는 '유사한'유형에 대한 비트를 추가 했으므로 어떤 구현에 대해서도 알지 못합니다. 변하기 쉬운.

준수하는 구현은 기술적으로 거부 할 수 있지만 사용하고자하는 구현에는 이식 할 수 있다고 생각합니다.

+0

어쨌든 합법적 인 별칭에 유사한 유형을 추가하면 제공되는 인수와 형식 매개 변수에 잘못된 유형이있는 함수를 사용할 수 있다는 것을 알지 못했습니다. 그러나 그렇습니다. –

+0

@SteveJessop 공식을 사용하기 위해서는 의도 된 것이 아니며, 공식 매개 변수에'const'를 추가하면 이름 맹 글링에 영향을 미칠 것이기 때문에 실제로는 가능하지 않습니다. 이것이'main'에서 작동하는 이유는'main'이 mangling에서 면제되기 때문입니다. (어쨌든 main을 과부하시키지 못하기 때문입니다.) 비슷한 타입의 추가는 오직'char **'를'char const * const *'로 접근 할 때 엄격한 앨리어스 규칙을 위반하여 정의되지 않은 행동을 자동적으로 얻지 않는다는 것을 의미합니다. 내가 아는 모든 구현에서 C++ 11 이전에는 정상적으로 작동했지만 기술적으로는 UB였습니다. 이제는 UB가되어서는 안됩니다 – bames53

+3

'auto main (int argc, char * argv []) -> int'가 다른 서명 인 소스 또는 표준 인용문을 가지고 있습니까? 'int main (int argc, char ** argv)'도 다른 서명이 아닐까요? –

관련 문제