gpt4 book ai didi

c++ - 为什么 std::array::begin() 自 C++17 以来是 constexpr?

转载 作者:行者123 更新时间:2023-12-01 14:03:38 25 4
gpt4 key购买 nike

从 C++17 开始, std::array<T,N>::begin() 是 constexpr:

constexpr iterator begin() noexcept;

但是 begin怎么可能返回在编译时知道吗?例如:
int main() {
auto p = std::make_unique<std::array<int,2>>();
auto it = p->begin();
}

是完全合法的代码(虽然可能有点无用)。底层数组的开始以及迭代器取决于 malloc 的地址。

我有一种感觉,我对什么 constexpr 有误解我不知道怎么做 任何 非静态成员函数可能是 constexpr ,特别是如果它(可传递地)访问数据成员。

最佳答案

constexpr可以在非编译时常量表达式中调用函数。此类调用在运行时进行评估。仅当 constexpr函数在编译时常量表达式中调用,是在编译时计算的函数。

But how can the return of begin be known at compile time?



当数组本身是编译时常量时,可以在编译时知道。

当数组不是编译时常量时,在编译时无法知道这一事实不是问题,因为在这种情况下函数是在运行时执行的。

关于c++ - 为什么 std::array<T,N>::begin() 自 C++17 以来是 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61460766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com