bit*_*ask 4 c++ compile-time constexpr c++17
从 C++17 开始,std::array<T,N>::begin()是 constexpr:
constexpr iterator begin() noexcept;
Run Code Online (Sandbox Code Playgroud)
但是如何begin在编译时知道返回值呢?例如:
int main() {
auto p = std::make_unique<std::array<int,2>>();
auto it = p->begin();
}
Run Code Online (Sandbox Code Playgroud)
是完全合法的代码(虽然可能有点无用)。底层数组的开始以及迭代器取决于 malloc 的地址。
我有一种感觉,我对什么是误解,constexpr因为我看不到任何非静态成员函数可能是什么constexpr,特别是如果它(可传递地)访问数据成员。
constexpr可以在非编译时常量表达式中调用函数。此类调用在运行时进行评估。只有constexpr在编译时常量表达式中调用函数时,才在编译时计算函数。
但是如何在编译时知道 begin 的返回呢?
当数组本身是编译时常量时,可以在编译时知道。
当数组不是编译时常量时,在编译时无法知道这一事实不是问题,因为在这种情况下函数是在运行时执行的。