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 对象?
只存储指针,而不存储 std::array 对象?
你不能。
C++ 的规则不会仅仅因为你的代码在编译时执行而被暂停(事实上,不暂停这些规则是成功的一半)constexpr)。该数组需要存在才能使指向它的指针有意义。这意味着当有人使用该指针时,数组对象需要继续存在。
获取指向被销毁的临时对象的指针将使该指针指向已销毁的对象。这对于编译时代码和运行时代码来说都是如此。使用该指针在编译时和运行时一样不起作用。事实上,它的功能较少,因为必须在编译时诊断 UB(这是访问该指针将引发的问题)并将其转变为编译错误。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |