是否可以在声明后设置 constexpr 数组中元素的值?

use*_*392 6 c++ arrays constexpr c++11

是否可以constexpr在某一点声明一个 const 数组(可能),然后在另一个地方定义它,一次一个元素?

例如

extern constexpr int myArray[100];


myArray[0] = myConstexprFunction(0);
myArray[1] = myConstexprFunction(1);
// ...
myArray[100] = myConstexprFunction(100);
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的将需要这样的东西。也许可以使用以下内容:http : //b.atch.se/posts/constexpr-counter/

但是如果这种技术在下一个 C++ 标准中是非法的(我希望不是),我想使用更安全的技术。

[编辑]放宽一些要求怎么样..假设我想做这样的事情:

constexpr int myConstExprFunction(int arg) { return arg + 100;}
// other code...
constexpr int a = myConstExprFunctionBegin(10);
constexpr int b = myConstExprFunction(20);
constexpr int c = myConstExprFunction(30);
constexpr int d = myConstExprFunctionEnd(40);
Run Code Online (Sandbox Code Playgroud)

我想要的是 myConstExprFunctionEnd 能够使用先前函数创建的值生成最终数组。当然,一切都在编译时。

[EDIT2] C++11 解决方案非常受欢迎

ken*_*ytm 5

constexpr最近C++的要求很宽松,所以你可以这样写:

// requires C++17:
constexpr auto myArray = [] {
    std::array<int, 100> result {};
    for (size_t i = 0; i < 100; ++ i) {
        result[i] = i * i;
    }
    return result;
}();
Run Code Online (Sandbox Code Playgroud)

注意我使用了std::array<int, 100>而不是int[100]因为函数不能返回 C 数组。

上面的代码需要 C++17 有两个原因:

  1. constexpr 拉姆达
  2. 可变operator[]不是constexpr在C之前++ 17

使用单独的 constexpr 函数可以轻松解决问题 1。问题 2 只能通过定义您自己的数组包装器来解决。

// requires C++14:

template <typename T, size_t n>
struct ConstexprArray {
    T data[n];
    constexpr ConstexprArray() : data{} {}
    constexpr T& operator[](size_t i) { return data[i]; }
};

constexpr auto initialize_my_array() -> ConstexprArray<int, 100> {
    ConstexprArray<int, 100> result {};
    for (size_t i = 0; i < 100; ++ i) {
        result[i] = i * i;
    }
    return result;
}

constexpr auto myArray = initialize_my_array();
Run Code Online (Sandbox Code Playgroud)


Gui*_*cot 4

看看您的编辑,我只会回答no,因为编译器无法将一组变量转换为数组。它只是不那样工作。C++ 中没有任何构造可以接受一堆声明、删除它们并用另一个声明替换它。源代码预处理器或生成器可能能够允许您寻求的语法。

如果您对不需要外部工具的解决方案感兴趣,您可以创建一个constexpr返回数组的函数:

constexpr auto makeMyArray() {
    std::array<int, 100> myArray{};

    myArray[0] = myConstExprFunction(10);
    myArray[1] = myConstExprFunction(20);
    // ...

    return myArray;
}
Run Code Online (Sandbox Code Playgroud)

然后,初始化你的数组:

constexpr auto myArray = makeMyArray();
Run Code Online (Sandbox Code Playgroud)

  • C++11 中没有。但是,您可以用递归函数调用替换循环或多个语句。它需要 C++14。C++11 中的 constexpr 函数中不能有多个语句。 (2认同)