是否可以从constexpr函数初始化constexpr std :: array?

时间:2020-07-19 04:35:00

标签: c++ c++14 constexpr

我正在尝试制作一个应该为{1, 2, 3, 4, 5, 6, 7, 8, 0}的数组,我想做这样的事情:

constexpr std::array<int, 9> getFinalTable(){
    std::array<int, 9> result{};
    for (size_t i = 0; i < 9 - 1; ++i) 
        result[i] = i + 1;
    result.back() = 0;
    return result;
}

但是Visual Studio在这里输入时间时阻止了我:

 constexpr std::array<int, 9> final_table = getFinalTable();

是否有可能做我想做的事情? (我希望这样,以便我可以随时更改Table的大小,并且仍然可以使用。)

1 个答案:

答案 0 :(得分:0)

它将在-std=c++17(C ++ 17及更高版本)编译中正常工作。

从该问题的第一个答案开始,OP的注释表示该行:

result.back() = 0;

由于以下原因,不允许编译器对其进行编译:

main.cpp: In function 'constexpr std::array<int, 9> getFinalTable()':
main.cpp:9:21: error: call to non-'constexpr' function 'std::array<_Tp, _Nm>::value_type& std::array<_Tp, _Nm>::back() [with _Tp = int; long long unsigned int _Nm = 9; std::array<_Tp, _Nm>::reference = int&; std::array<_Tp, _Nm>::value_type = int]'
    9 |         result.back() = 0;
      |

删除后,相关程序应类似于:

const int size = 9;

constexpr std::array<int, size> getFinalTable() {
    std::array<int, size> result{};
    
    for (size_t i = 0; i < size - 1; ++i) 
        result[i] = i + 1;
//  result.back() = 0;

    return result;
}

int main(void) {
    const std::array<int, size> final_table = getFinalTable();
}