2014-03-04 2 views
2

Bar의 배열 인 Bar 클래스의 constexpr 정적 멤버에 부트 스트랩 문제가 있습니다. 다음 완벽하게 올바른 코드를 고려해정적 constexpr 구성원으로 클래스 요소의 배열

struct Foo { 
    int i; 
    static const std::array<Foo, 2> A; 
}; 
const std::array<Foo, 2> Foo::A {{{1},{2}}}; 

가 지금은 Foo::A뿐만 아니라 const를뿐만 아니라 constexpr을 가지고 싶습니다. 나는 정적 constexpr 회원 초기화를 완료해야합니다 문제가 안으로 클래스 선언을 완료해야합니다 직면 했어. 그러나 선언이 아직 완료되지 않았으므로 컴파일러는 인스턴스의 크기를 아직 모르기 때문에 배열을 거부합니다. 예를 들어

struct Bar { 
    int i; 
    constexpr static const std::array<Bar, 2> A{{{1},{2}}}; 
}; 

는 그것을 해결하는 방법이

/usr/include/c++/4.8/array: In instantiation of ‘struct std::array<Bar, 2ul>’: 
ess.cpp:14:56: required from here 
/usr/include/c++/4.8/array:97:56: error: ‘std::array<_Tp, _Nm>::_M_elems’ has incomplete type 
     typename _AT_Type::_Type       _M_elems; 

으로 거부? 또는 해결 방법은 무엇입니까?

답변

0

나는 배열이 계산

  1. 수 있도록 다음과 같은 해결책을 찾았습니다 컴파일시
  2. 배열은 복사되지 않고 구조체에 저장됩니다.

아이디어는 constexpr 배열에 const 참조를 사용하는 것입니다.

struct Bar { 
    int i; 
    static const std::array<Bar, 2> &A; 
}; 

constexpr const std::array<Bar, 2> BarA {{{1},{2}}}; 
const std::array<Bar, 2> &Bar::A = BarA; 
2

현재로서는 불가능합니다. 컴파일러는 constexpr이 실제로 허용되는지 여부를 미리 알 수 없습니다. 함수와 멤버 A를 교체하고 작동해야합니다

struct Bar 
{ 
    int i; 
    constexpr static std::array<Bar, 2> get_A() 
    { 
     return {{{1}, {2}}}; 
    } 
}; 

관련을 (거의 중복) : static constexpr member of same type as class being defined

+0

정말 내 문제에 매우 가까운 포인터 주셔서 감사합니다. 귀하의 솔루션에 대한 질문 : 배열 실제로 컴파일 시간에 계산 된 및 한 번만 저장되도록 보장합니까? 여기서 목표는 모든 것이 정적으로 계산되는 일종의 다중 싱글 톤 클래스를 가지는 것입니다. – hivert

+0

그것은 당신이 요구하는 것을해야하지만, 나는 현재 그것을 proove 할 수있는 방법이 없다. 제 컴파일러는'constexpr'을 아직 지원하지 않으며 constexpr-constructor에 정보 문을 추가하거나 주소를 사용하여 트릭을 할 수 없으므로 확인하기가 어렵습니다. 그러나 컴파일러가 둘 이상의 인스턴스를 작성하더라도 런타임 성능에는 영향을 미치지 않습니다. 결과 배열은 컴파일시 계산되기 때문에 동일해야합니다. – Excelcius

+0

실제로 문제가 해결되지 않습니다. 정말 참조 constness 보장하기 위해 고유 한 배열을 갖고 싶어. 만약에'static_assert (& Bar :: get_A() == & Bar :: get_A(), Duplicate ");'그렇다면'Bar :: get_A()'가 임시 배열을 리턴하고 assert가 실패한다는 경고를 받았다. – hivert

관련 문제