2013-01-15 3 views
13

발견하지정적 constexpr 멤버 함수는 다음의 코드는

#include <array> 

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    template<unsigned P> 
    using array = std::array<type,max_pole(P)>;   // wrong? 

    template<unsigned P> 
    static void do_something(array<P> const&, array<P>&); 
}; 

은 GCC 4.7.0 (g ++ -c -std =은 ++ 11 ℃)

error: ‘max_pole’ was not declared in this scope 

이인가 준다 올바른 (컴파일러의 동작)? 표시된 줄에 kernel::max_pole으로 바꾸어 max_pole을 해결하면 잘 컴파일됩니다.

EDIT 버그 C++/55992로 알려진 버그실라에게보고 한 내용은 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55992을 참조하십시오. gcc 4.7.x 및 4.8.0에서도 발생합니다.

+0

테스트 된 결과 :'g ++ 4.7.2'와 동일 누군가가 4.8과 같은 새로운 버전을 사용합니까? 어쩌면 이것은 수정 된 버그 일 것입니다 ... – leemes

답변

9

서식 파일이 Clang 3.2에서 제대로 컴파일됩니다. 나는 그것이 GCC 버그라고 믿는다. (GCC 4.7.2에도있다.) GCC 4.8.0의 변경 노트에는 그러한 버그 수정이 언급되어 있지 않습니다.

do_something<>의 선언을 제거하면 컴파일 오류가 사라진다는 점에 유의하십시오. 이로 인해 차이가 발생하지 않습니다.

또 하나의 힌트 :이 템플릿은 하지는 GCC 4.7.2에서 컴파일 않지만 :

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    template<typename T> 
    using array2 = int[max_pole(3)]; // ERROR! 

    static void do_something(array2<int> const&, array2<int>&); 
}; 

이 템플릿 는 않습니다 컴파일 : max_pole 이후

template<unsigned MaxP, typename type> 
struct kernel 
{ 
    static constexpr unsigned max_pole(unsigned P) 
    { return P>MaxP? MaxP:P; } 

    // template<typename T> <--- removed 
    using array2 = int[max_pole(3)]; // OK 

    static void do_something(array2 const&, array2&); 
}; 

이 두 경우 모두 입니다정규화되지 않은 독립적 인 이름, 조회 전략 shoul 두 경우 모두 동일해야하며 그렇지 않은 경우도 있습니다. 나에게 이것은 버그로서의 자격이있다.

+0

당신의 연구에 따르면,이 상황은 특정 상황에서 두 개의 새로운 C++ 11 기능 ('constexpr' + 별칭 템플릿)을 혼합 할 때 특별히 발생합니다. 그런 다음 컴파일러 버그에 대한 완벽한 시나리오. – Gorpik

+0

@ Gorpik : 네, 저는 같은 느낌을 가지고 있습니다 –

+1

+1 감사합니다. 나는 같은 느낌이었다. bugzilla에서 보도했다. – Walter