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

标签 c++ c++20 constexpr stdarray 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();

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

最佳答案

storing only a pointer, not the std::array object?

你不能。

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

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

关于c++ - 尝试从 std::array 将 .data() 编译为 c++20 中的 constexpr 函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74952818/

相关文章:

c++ - 为什么标记为 "hidden"的函数在从 gcc 4 中的外部模块调用时不会抛出错误?

c++ - 您可以将 Ada 泛型函数导出到 C++ 吗?

c# - 当 p/调用时,C/C++ 函数在 MonoTouch 中返回 NaN

c++ - `equality_­comparable_with` 是否需要 `common_reference` ?

c++ - 未指定的隐式对象创建

c++ - 我如何能够在 1 字节的普通字符串中存储日文字符?

c++ - 如何用当前年份填充 chrono::year?

c++ - 我什么时候会在 constexpr 上使用 std::integral_constant?

c++ - 为什么我下面的第二个片段显示未定义的行为?

c++ - 全局变量的constexpr初始化