2013-04-29 7 views
3

나는 Visual Studio 2010과 SP1을 사용하고 있습니다. 다음 코드는 컴파일러를 충돌시킵니다.컴파일러가 자동으로 충돌 함

template <typename T> 
class MyClass 
{ 
public: 
    typedef int my_int; 

    const my_int foo(); 

}; 

template <typename T> 
const auto MyClass<T>::foo() -> my_int 
// auto MyClass<T>::foo() -> const my_int // THIS WORKS! 
{ 
    return my_int(1); 
} 

int main() 
{ 
    MyClass<int> m; 
    m.foo(); 
} 

문제를 해결하는 주석 처리 된 줄을 유의하십시오. 여기에서 auto을 올바르게 사용하고 있습니까 (const 한정자 auto). 해결 방법은 기본적으로 정확히 동일한 것입니까? 즉, 컴파일러의 버그가 해결 될 때까지 안전하게 사용할 수 있습니까? 그리고 마지막으로, 나는이 문제를 겪고있는 유일한 사람인가, 그렇지 않다면 나는 버그 보고서를 제출할 것이다.

참고 : 나는 여기의 const가 거의 이해하지 못한다는 것을 알고 있습니다. 나는 실제 프로젝트에서 const 객체에 대한 참조를 반환하는 작은 프로젝트에서 버그를 복제하려고했습니다.

+0

확장 또는 추가 기능이 원인 일 수 있습니다. 내 설치로 몇 가지 오류로 컴파일 완료. –

+0

@CaptainObvlious : 어떤 오류가 표시됩니까? 내가 볼 수있는 한, 그 코드는 컴파일되어야한다. – Samaursa

+0

실제로 컴파일됩니다. http://ideone.com/iaFxeu – Samaursa

답변

3

코드가 C++ 11에서 잘못 작성된 경우 : 후행 반환 유형이있는 경우 auto이어야합니다 (C++ 11 사양의 상태는 8.3.5 [dcl.fct ]/2 "T는 단일 형식 지정자auto"이어야합니다. 여기서 T은 함수 이름 앞에 나타나는 "형식"입니다.

모든 컴파일러 충돌은 컴파일러 버그이므로 프로그램을 컴파일 할 때 Visual C++ 2010 컴파일러가 충돌하는 버그입니다. 이 버그는 수정되었습니다. Visual C++ 2013 적절한 컴파일 오류가있는 프로그램을 거부합니다.

+0

+1 글자 그대로 글을 올리려는 것이 오, 글자를 빨리 입력해야합니다. 'clang'에서 이것은 오류이며,'return 형의 함수는 return 형을 'auto'로 지정해야하지만'gcc'는 반환하지 않는다고 불평합니다. –

+0

아, 나는이 질문이 얼마나 오래되었는지 깨닫지 못했다. 나는 그것이 단지 첫 페이지에 나타 났으며 그것이 새로운 것이라고 생각했다. –

+0

나는 오래된 게시물을 살펴보고 태그를 정리하고 편집을 게시 한 후 실제로 흥미로운 질문임을 깨달았습니다. –

1

여러 컴파일러에서 코드를 시험해 본 결과, const auto을 후행 형으로 사용하면 오류라는 것을 알게되었을 수도 있습니다. online C++ compilers이 여러 개 있습니다.

error: function with trailing return type must specify return type 'auto', not 'const auto'

초안의 C++ 표준의 관련 섹션이 섹션 8.3.5기능 제 말한다 (: 당신이 clang이 코드를 시도했다 경우 다음과 같은 오류 (live example)를받은 것 중점 광) :

In a declaration T D where D has the form

D1 (parameter-declaration-clause) cv-qualifier-seqopt 
    ref-qualifieropt exception-specificationopt attribute-specifier-seqopt 
    trailing-return-type 

[...]T shall be the single type-specifier auto.[...]

+0

나는 실제로 여기 그것을 시도했다 : http://ideone.com/iaFxeu하지만 당신 말이 맞아, 나는 더 많은 컴파일러를 시험해 보았어야했다. 링크 (+1)에 감사드립니다. – Samaursa