スパンを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スパン型を作成することは可能ですか?


constexprsはそれらを削除しないのでコメントを外します。
Andreas Loanjoe

あなたはconstexprスパンを初期化するつもりであるランタイムスパンを初期化しています
Andreas Loanjoe

どー。なぜそうしたのかわかりません。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機能します(明示的ななしstatic)。このようなオブジェクトにはデフォルトの静的ストレージ期間がありますか、それともこれは何か違うのですか?
n314159

@ n314159それが許可されているかどうか、または恐ろしいことに陥ったかどうかはわかりません。constexpr関数の特殊化がコア定数式でない場合、関数の形式が正しくないため、診断は必要ありません。 [expr.const] / 10は静的変数のみを許可します。
NathanOliver

@ n314159:私は確かにあなたが作品(または「作品」)を言っているまさにないんだけど、定数式として何かを使用した場合の違いに注意してください機能(constexprのかなし)とするものを使用して構築する定数を表現を経由して constexprの機能。
デイビスヘリング

非静的(定数)は定数式では使用できますが、アドレスでは使用できないと言いたい場合があります
Davis Herring
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.