首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么std::iota常量表达式不是?

为什么std::iota常量表达式不是?
EN

Stack Overflow用户
提问于 2017-01-12 10:10:46
回答 1查看 891关注 0票数 9

下面的程序打印出一副洗过的牌(作为整数):

代码语言:javascript
复制
#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编译后,程序将运行并打印:

代码语言:javascript
复制
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

代码语言:javascript
复制
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::iota不是constexpr。我的问题是为什么?当然,std::iota在编译时是可确定的。标准库是不是在这个特性上落后了?

EN

回答 1

Stack Overflow用户

发布于 2017-03-09 15:09:00

这应该被提议添加到标准中。从现在的情况来看,情况并非如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41604017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档