Span, constexpr olabilir mi?


11

Std :: span'ın tüm kurucuları constexpr olarak ilan edilir, ancak hiçbirinin bir bağlam bağlamında çalışmasını sağlayamıyorum. Aşağıdaki bağlamlardan herhangi birinin kaldırılması derleme hatasına neden olacaktır.

#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};
}

Aslında, bir işaretçi veya başvuru başlatmaları gerektiğinde derleyiciler derleme zamanında değerlendirilemez gibi görünüyor, çünkü bir constexpr span türü oluşturmak mümkün mü?


Rahatsızlık onları kaldırmaz.
Andreas Loanjoe

Bir bağlam süresini başlatmak istediğim bir çalışma süresi aralığını başlatıyorsunuz
Andreas Loanjoe

Hamuru. Bunu neden yaptığımdan emin değilim. nevermind
NathanOliver

garip, neden gerekli olacağını anlamıyorum, açıklık sadece yerel kapsamda yaşıyor ...
Andreas Loanjoe

Yanıtlar:


13

Statik olmayan bir işlev yerel değişkenlerini böyle bir sabit ifadede kullanamazsınız. Adres kararlılığına ihtiyacınız vardır ve bu yalnızca statik nesneler tarafından gerçekleştirilir. Kodu şu şekilde değiştirmek:

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};
}

veya

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};
}

Bir oluşturmanıza izin verir constexpr std::span.


5
Sorun sorun değil. Depolama süresi. Statik yerel çalışmalıdır.
eerorika

Tümü bir constexprişlev içindeki işlev yerel nesneler ise (açık olmadan static) da çalışır. Bu tür nesnelerin varsayılan statik depolama süresi var mı veya bu farklı bir şey mi?
n314159

@ n314159 Buna izin verilip verilmediğinden veya korkulana düştüğünüzden emin değilim: bir constexpr işlevi uzmanlığı çekirdek sabit bir ifade değilse, işlev kötü biçimlendirilmişse, tanı için gerekli bir madde yoktur. [expr.const] / 10 yalnızca statik değişkenlere izin verir.
NathanOliver

@ n314159: Emin tam olarak işler (ya da “işleri”) diyerek, fakat sabit bir ifadesi olarak bir şey kullanma arasındaki farkın dikkatli olun ben değilim de (hayır constexpr ya) bir fonksiyonu ve bir şeyler kullanarak inşa bir sabiti ekspresyon yoluyla bir constexpr fonksiyonu.
Davis Herring

Statik olmayan (sabit) değerlerin sabit ifadelerde kullanılabileceğini, ancak adreslerinin kullanılamayacağını söylemek isteyebilirsiniz .
Davis Herring
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.