2017-01-12 5 views
7
は、次のプログラムは、(整数として)カードのシャッフルデッキ出力し

なぜstd :: iota constexprではないのですか?

#include <array> 
#include <algorithm> 
#include <random> 
#include <iostream> 

typedef unsigned int card; 
typedef std::array<card, 52> deck; 
auto shuffled_deck(){ 
    deck d = {}; 
    std::iota(d.begin(), d.end(), 0); 
    std::shuffle(d.begin(), d.end(), std::default_random_engine()); 
    return d; 
} 

int main(){ 
    for(auto& i: shuffled_deck()) std::cout << i << ", "; 
} 

g++ -std=c++17プログラムでコンパイルを実行して印刷:

18, 34, 27, 46, 11, 3, 12, 19, 33, 21, 41, 13, 36, 49, 40, 22, 8, 9, 28, 2, 6, 30, 50, 24, 37, 32, 35, 4, 15, 45, 47, 43, 14, 44, 20, 23, 29, 7, 31, 51, 26, 10, 42, 48, 0, 38, 5, 16, 17, 1, 25, 39, 

これは素晴らしいですが、直感は、このことを私に伝えますデッキはコンパイル時に作成することができますので、私はshuffled_deck方法constexpr

constexpr auto shuffled_deck(){ 
    deck d = {}; 
    std::iota(d.begin(), d.end(), 0); // Error! Iota isn't constexpr! 
    std::shuffle(d.begin(), d.end(), std::default_random_engine()); 
    return d; 
} 

コムを作りますg++ -std=c++17でファイルを書き込むと、std::iotaconstexprではないというコンパイルエラーが発生します。私の質問はなぜですか?確かにstd::iotaはコンパイル時に決定可能です。この機能では、標準ライブラリは遅れていますか?

+7

「std :: iotaがコンパイル時に決定可能だ」と確信しているなら、好奇心のために、 'constexpr'の要件を満たすために' iota'をどうやって実装しますか?私は 'begin()'と 'end()'のどちらも 'constexpr'ではないので、それが実現可能になることに特に興味があります。 – WhozCraig

+0

あなたの場合(テンプレートに渡される定数値)、ソリューションはコンパイル時に決定可能です。しかし、より汎用的なソリューションをどのように実装すれば、このように決定することもできますか? – tmpearce

+6

@WhozCraig:これは 'C++ 1z'というタグが付いています。 C++では、 'begin'と' end'_are_stexexprのように、 'data'と' size'を使うことはできませんでした。どのイテータについても何も気にしません。 – ildjarn

答えて

0

標準に追加することを提案する必要があります。今のところそれはそうではありません。

関連する問題