span สามารถเป็น constexpr ได้หรือไม่


11

Constructor ของ 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 type หรือไม่เนื่องจากดูเหมือนว่าคอนสตรัคเตอร์จะไม่สามารถประเมินได้ ณ เวลารวบรวมเมื่อต้องเริ่มต้นตัวชี้หรือการอ้างอิง


การไม่ใส่เครื่องหมายความคิดเห็นไว้ห้ามลบออก
Andreas Loanjoe

คุณกำลังเริ่มต้นช่วงรันไทม์ฉันหมายถึงการเริ่มต้นช่วง constexpr
Andreas Loanjoe

Doh ไม่แน่ใจว่าทำไมฉันทำอย่างนั้น ไม่เป็นไร
NathanOliver

แปลกไม่เห็นว่าทำไมมันจะมีความจำเป็นช่วงเท่านั้นอาศัยอยู่ภายในขอบเขตท้องถิ่นต่อไป ...
Andreas Loanjoe

มีความเกี่ยวข้องอย่างใกล้ชิด: stackoverflow.com/q/57545503/2069064
Barry

คำตอบ:


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ฟังก์ชั่น (ไม่ชัดเจนstatic) วัตถุดังกล่าวมีระยะเวลาเก็บข้อมูลเริ่มต้นแบบคงที่หรือสิ่งนี้แตกต่างกันหรือไม่?
n314159

@ n314159 ฉันไม่แน่ใจว่าได้รับอนุญาตหรือว่าคุณตกอยู่ในความหวาดกลัว: หากไม่มีความเชี่ยวชาญของฟังก์ชั่น constexpr เป็นนิพจน์คงที่หลักฟังก์ชั่นจะไม่ถูกต้องไม่มีข้อวินิจฉัยที่จำเป็น [expr.const] / 10อนุญาตให้ใช้ตัวแปรแบบคงที่เท่านั้น
NathanOliver

@ n314159: ฉันไม่แน่ใจว่าสิ่งที่คุณกำลังพูดถึงงาน (หรือ "งาน") แต่ต้องระวังความแตกต่างระหว่างการใช้บางสิ่งบางอย่างเป็นนิพจน์คงที่ในฟังก์ชั่น (constexpr หรือไม่) และใช้สิ่งที่สร้างคงที่ แสดงออกผ่านฟังก์ชั่น constexpr
Davis Herring

คุณอาจต้องการที่จะบอกว่าไม่คงที่ (คงที่) ค่าสามารถนำมาใช้ในการแสดงออกอย่างต่อเนื่อง แต่ไม่ได้ของพวกเขาอยู่
Davis Herring
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.