c++ - 为什么 std::iota 不是 constexpr?

标签 c++ constexpr c++17 iota

以下程序打印出一副洗好的纸牌(作为整数):

#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::iota 不是 constexpr。我的问题是为什么?当然 std::iota 在编译时是可确定的。标准库是否只是落后于此功能?

最佳答案

这应该被提议添加到标准中。就目前而言,事实并非如此。

关于c++ - 为什么 std::iota 不是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41604017/

相关文章:

c++ - const vs constexpr 变量

c++ - 如何定义 variant<x,y,z> 提取模板参数的子类型

c++ - 内仿函数概念或接口(interface)

c++ - static_cast const 引用 void*

c++ - OpenGL 以编程方式创建纹理

c++ - 如何开始使用 Android Studio C++ 开发

c++ - 是否应该通过 std::cin 将负数读入 unsigned 失败(gcc,clang 不同意)?

c++ - Qt 小部件在 Windows 中不服从拖放

c++ - 我对 constexpr 函数感到困惑?

c++ - 使用用户定义的文字初始化 constexpr 数组