尝试从 std::array 编译 .data() 作为 c++20 中的 constexpr 函数时出错

jab*_*uko 2 c++ constexpr stdarray c++20 constexpr-function

我试图在编译时计算一个数组以加速某些函数,但遇到一个错误,但无法在 cppreference 的帮助下解决该错误。

代码归结为:

#include <cstddef>
#include <array>

template<typename T, size_t size>
constexpr auto giveArray()
{
    std::array<T, size> arr;
    for(size_t i = 0; i < size; ++i)
        arr[i] = 0;
    return arr;
}

constexpr auto arr = giveArray<int,10>().data();
Run Code Online (Sandbox Code Playgroud)

在 ubuntu 上使用“$ g++ -std=c++20 code.cpp”进行编译时,出现错误:.data() 不是 constexpr 函数,但它确实是。为什么我会收到此错误以及如何修复它,同时仍在编译时运行此函数并仅存储指针,而不存储 std::array 对象?

Nic*_*las 6

只存储指针,而不存储 std::array 对象?

你不能。

C++ 的规则不会仅仅因为你的代码在编译时执行而被暂停(事实上,暂停这些规则是成功的一半)constexpr)。该数组需要存在才能使指向它的指针有意义。这意味着当有人使用该指针时,数组对象需要继续存在。

获取指向被销毁的临时对象的指针将使该指针指向已销毁的对象。这对于编译时代码和运行时代码来说都是如此。使用该指针在编译时和运行时一样不起作用。事实上,它的功能较少,因为必须在编译时诊断 UB(这是访问该指针将引发的问题)并将其转变为编译错误。