Чи може проміжок бути constexpr?


11

Усі конструктори std :: span оголошені constexpr, однак я не можу змусити жодного з них працювати в контексті constexpr. Якщо коментувати будь-який з contexpr нижче, це призведе до помилки компіляції.

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

Чи справді можливо створити тип проміжного типу contexpr, оскільки, здається, конструктори ніколи не можуть бути оцінені під час компіляції, коли їм доведеться ініціалізувати покажчик чи посилання?


Відкиньте коментарі конспектори не видаляйте їх.
Андреас Лоанхое

Ви ініціалізуєте проміжок часу, який я мав на меті ініціалізувати проміжок конспектора
Andreas Loanjoe

До. Не впевнений, чому я це зробив. nevermind
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 чи ні) і використовувати що - то , щоб побудувати постійну вираження за допомогою функції contexpr.
Девіс Оселедець

Ви можете сказати, що нестатичні (постійні) значення можуть використовуватися в постійних виразах, але не їх адреси .
Девіс оселедець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.