2017-01-12 18 views
7

Chương trình sau in ra một cỗ xáo trộn của thẻ (như số nguyên):Tại sao không phải là tiêu chuẩn :: 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 << ", "; 
} 

Biên soạn với g++ -std=c++17 chương trình chạy và in:

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, 

này là rất tốt, nhưng trực giác nói với tôi rằng đây có thể được tạo tại thời điểm biên dịch, vì vậy, tôi thực hiện phương thức shuffled_deckconstexpr

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

Com cọc với g++ -std=c++17 cho bạn lỗi biên dịch nói rằng std::iota không phải là constexpr. Câu hỏi của tôi là tại sao? Chắc chắn std::iota là yếu tố quyết định tại thời gian biên dịch. Thư viện chuẩn có bị tụt hậu so với tính năng này không?

+7

Nếu bạn bị thuyết phục rằng "std :: iota có thể xác định tại thời gian biên dịch", sau đó hết tò mò, làm cách nào * bạn * triển khai 'iota' để đáp ứng các yêu cầu của' constexpr'? Tôi đặc biệt tò mò như thế nào 'begin()', và 'end()', không phải trong số đó là 'constexpr', sẽ làm cho điều đó khả thi. – WhozCraig

+0

Trong trường hợp của bạn - một giá trị không đổi được chuyển đến mẫu - một giải pháp có thể được xác định tại thời gian biên dịch. Nhưng làm thế nào một giải pháp chung chung hơn được thực hiện để nó cũng sẽ được xác định theo cách này? – tmpearce

+6

@WhozCraig: Thẻ này được gắn thẻ 'C++ 1z'; trong C++ 17, 'begin' và' end' _are_ constexpr, và thậm chí nếu chúng không phải ai cũng có thể dùng 'data' và' size'. Không ai trong số đó là về 'iota', mà quan tâm không có gì của vòng lặp bạn cung cấp cho nó ... – ildjarn

Trả lời

0

Điều này sẽ được đề xuất để được thêm vào tiêu chuẩn. Vì nó đứng ngay bây giờ nó chỉ là không.

Các vấn đề liên quan