C ++ 20でビューを使用してコンテナーを構築できますか?


10

範囲は、C ++ 20標準バージョンでC ++に導入されます。

私の質問:任意の範囲で(既存の)標準ライブラリコンテナを構築できますか?そしてさらに重要なのは、範囲ビューで?

たとえば、これは:

#include <vector>
#include <iostream>
#include <ranges>

int main() {
    auto sq = [](int x) { return x * x; };
    std::vector<int> vec { 3, 4, 5 };
    std::vector<int> squares { std::ranges::views::transform(vec, sq) };
    for(auto i : squares) { std::cout << i << ' '; }
    std::cout << std::endl;
}

印刷する有効なプログラム9 16 25ですか?

これは、価値があるもののために、ranges-v3ライブラリコンパイルされます。



StoryTellerごと:なぜ次のRangesライブラリが範囲からのコンテナーの初期化をサポートしないか、明らかに重複していますか?—ただし、投票の解決によって回答が変わる可能性があります。
Davis Herring

@DavisHerring何が変わるか?P1206はそもそも20 年間は考慮されていませんでした。ここに開いたままのNBコメントはないと思いますか?P1391は、範囲コンストラクターなしで採用されました(誤解を招く例にも関わらず)。
バリー

@バリー:LEWG はコナで転送したが、最近のリフレクタートラフィックを誤解したようだ。
Davis Herring

@DavisHerringああ、私はそれが2回議論されたことを逃しました-私は4-7の投票までスクロールダウンし、それはそれだと思いました。
バリー

回答:


8

私の質問:任意の範囲で(既存の)標準ライブラリコンテナを構築できますか?そしてさらに重要なのは、範囲ビューで?

いいえstd::span<T>。正しい基準を満たす任意の範囲から構築可能な唯一の標準ライブラリコンポーネントはです。

標準ライブラリがおそらく進む方向は、range-v3も向かっている方向です(range-v3からのリンクされた例はコンパイルされますが、非推奨の変換について警告します)- ヘルパーを使用して変換を実行します:

std::vector<int> squares =
    std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;

範囲コンストラクターの方向に進まない理由の1つは、使用しているまさにその例からわかります。

std::vector<int> squares { std::ranges::views::transform(vec, sq) };

その宣言が次の2つとどの程度異なるかを考えてみましょう。

std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );

v必ずしもあろうvector<transform_view<...>>含む単一transform_view、一方w Aであろうvector<int>

さらに、注意深く制約されたコンテナーコンストラクターを標準ライブラリにさらに追加しても、サードパーティのコンテナータイプはいずれにしても役立ちませんranges::to


ステートメントは、初期化vし、w私には同じように見えます。おそらくw、として宣言するつもりvector<int>でした。そうでなければ、これが正解です。
Eric Niebler

5
@EricNiebler正確に:-)彼らは同じに見えます。彼らは同じではありません。
バリー

したがって、私のプログラムはコンパイルされますが、私が思っているようには動作しません。OK。
アインポクルム

1
ありがとう、CTAD ...
TC

その理由vを教えていただけますwか?コンストラクタテンプレートの引数の演繹がどのように機能するかと関係がありますか?
Johannes Schaub-litb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.