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;
으로 거부? 또는 해결 방법은 무엇입니까?
정말 내 문제에 매우 가까운 포인터 주셔서 감사합니다. 귀하의 솔루션에 대한 질문 : 배열 실제로 컴파일 시간에 계산 된 및 한 번만 저장되도록 보장합니까? 여기서 목표는 모든 것이 정적으로 계산되는 일종의 다중 싱글 톤 클래스를 가지는 것입니다. – hivert
그것은 당신이 요구하는 것을해야하지만, 나는 현재 그것을 proove 할 수있는 방법이 없다. 제 컴파일러는'constexpr'을 아직 지원하지 않으며 constexpr-constructor에 정보 문을 추가하거나 주소를 사용하여 트릭을 할 수 없으므로 확인하기가 어렵습니다. 그러나 컴파일러가 둘 이상의 인스턴스를 작성하더라도 런타임 성능에는 영향을 미치지 않습니다. 결과 배열은 컴파일시 계산되기 때문에 동일해야합니다. – Excelcius
실제로 문제가 해결되지 않습니다. 정말 참조 constness 보장하기 위해 고유 한 배열을 갖고 싶어. 만약에'static_assert (& Bar :: get_A() == & Bar :: get_A(), Duplicate ");'그렇다면'Bar :: get_A()'가 임시 배열을 리턴하고 assert가 실패한다는 경고를 받았다. – hivert