span은 constexpr 일 수 있습니까?


11

std :: span의 모든 생성자는 constexpr로 선언되었지만 constexpr 컨텍스트에서 작동하도록 할 수는 없습니다. 아래의 constexpr을 주석 해제하면 컴파일 오류가 발생합니다.

#include <array>
#include <span>

int main()
{
    constexpr int carray[3] = { 0, 1, 2 };
    constexpr std::array<int, 3> array{ 0, 1, 2 };
    using S = std::span<const int, 3>;

    /*constexpr*/ S span1{ array.data(), 3 };
    /*constexpr*/ S span2{array.begin(), array.end()};
    /*constexpr*/ S span3{carray};
    /*constexpr*/ S span4{array};
}

constexpr span 유형을 생성하는 것이 실제로 가능합니까? 생성자가 포인터 또는 참조를 초기화해야 할 때 컴파일 타임에 평가할 수없는 것처럼 보이기 때문에?


constexprs의 주석 처리를 제거해도 제거되지 않습니다.
Andreas Loanjoe

constexpr 범위를 초기화하려는 런타임 범위를 초기화하는 중입니다.
Andreas

도 내가 왜 그랬는지 모르겠습니다. nevermind
NathanOliver

이상한, 그것이 왜 필요한지 모르겠다. 스팬은 어쨌든 로컬 스코프 내부에만 살고있다.
Andreas Loanjoe

답변:


13

정적이 아닌 함수 로컬 변수는 상수 표현식에 사용할 수 없습니다. 주소 안정성이 필요하며 이는 정적 객체에 의해서만 달성됩니다. 코드를 수정

constexpr std::array<int, 3> array{ 0, 1, 2 };
constexpr int carray[3] = { 0, 1, 2 };

int main()
{
    using S = std::span<const int, 3>;

    constexpr S span1{ array.data(), 3 };
    constexpr S span2{array.begin(), array.end()};
    constexpr S span3{carray};
    constexpr S span4{array};
}

또는

int main()
{
    static constexpr std::array<int, 3> array{ 0, 1, 2 };
    static constexpr int carray[3] = { 0, 1, 2 };
    using S = std::span<const int, 3>;

    constexpr S span1{ array.data(), 3 };
    constexpr S span2{array.begin(), array.end()};
    constexpr S span3{carray};
    constexpr S span4{array};
}

을 만들 수 있습니다 constexpr std::span.


5
범위는 문제가 아닙니다. 저장 기간은입니다. 정적 로컬이 작동해야합니다.
eerorika

모든 것이 함수 내에서 constexpr함수 로컬 객체 인 경우에도 작동 합니다 (explicit static). 이러한 객체에는 기본 정적 저장 기간이 있습니까? 아니면 다른가요?
n314159

@ n314159 이것이 허용되는지 또는 겁에 질린 것인지 확실하지 않습니다. constexpr 함수의 전문화가 핵심 상수 표현식이 아닌 경우 함수가 잘못 구성되고 진단이 필요한 절이 없습니다. [expr.const] / 10 은 정적 변수 만 허용합니다.
NathanOliver 2018

@ n314159 : 나는 당신이 말하는 것이 정확히 무엇인지 확실하지 않지만 (constexpr 또는 no) 함수 에서 상수 표현식 으로 무언가를 사용 하고 상수 를 구성 하기 위해 무언가를 사용하는 것의 차이점에주의하십시오 constexpr 함수 를 통한 표현 .
Davis Herring 1

정적이 아닌 (일정한) 은 상수 표현식에 사용할 수 있지만 해당 주소 에는 사용할 수 없다고 말할 수 있습니다 .
Davis Herring
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.