你不能通过创建一个返回 std::array 的 constexpr 函数来创建一个 constexpr 数组吗?

问题描述 投票:0回答:1

我想在编译时构造一个数组值,并且在网上看到多个来源建议使用带有 constexpr 构造函数的结构:

template<int N>
struct A {
    constexpr A() : arr() {
        for (auto i = 0; i != N; ++i)
            arr[i] = i; 
    }
    int arr[N];
};

int main() {
    constexpr auto a = A<4>();
    for (auto x : a.arr)
        std::cout << x << '\n';
}

这只是旧建议(也许是 C++17 之前的建议?)还是我错过了一些东西,因为在我看来我可以执行以下操作:

constexpr std::array<int, 4> get_ary() {
    std::array<int, 4> ary = {};
    for (int i = 0; i < 4; ++i) {
        ary[i] = i;
    }
    return ary;
}

int main() {
    constexpr auto ary = get_ary();
    static_assert(ary.size() == 4, "The length should be 4!");
}
c++ c++17 constexpr
1个回答
3
投票

难道不能通过创建一个返回 1 的 constexpr 函数来创建一个 constexpr 数组吗?

不,无论函数是否为 constexpr,都不能返回数组。

但是,您可以返回包含数组作为成员的类的实例。您的

A
是此类模板的一个示例,
std::array
也是如此。这两个例子都是允许的。

std::array
示例在 C++17 之前不起作用。返回没有问题,但是使用非constexpr
operator[]
有问题。

© www.soinside.com 2019 - 2024. All rights reserved.