我试图在编译时计算一个数组以加快某些函数的速度,但我遇到了一个错误,我无法借助 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/