STL容器的constexpression下标运算符

时间:2013-12-04 12:30:27

标签: c++ stl constexpr c++14

constexpr const_reference at( size_type pos ) const;

STL容器访问器的这种重载如何与非constexpr参数一起使用?这种过载的经典用例是什么?

2 个答案:

答案 0 :(得分:8)

函数声明中没有constexpr参数。只有当且仅当该函数调用中涉及的所有参数都是常量表达式时,才能在编译时评估constexpr函数调用。

话虽这么说,在编译时必须评估constexpr函数的唯一情况是它用于计算模板参数。

您提供的示例至少有一个用例,适用于std::array::at

答案 1 :(得分:6)

  

STL容器访问器的这种重载如何与非constexpr参数一起使用?

声明一个函数constexpr意味着如果使用其所有参数的常量表达式调用它,那么结果也是一个常量表达式。

仍然可以使用非常量参数调用它;你不能将结果用作常量表达式。

  

这种过载的经典用例是什么?

从合适的容器中获取编译时常量,例如:

constexpr std::array<int,5> values {{2,3,5,7,11}};

template <int n> void do_stuff();  // needs a compile-time constant
do_stuff<values.at(3)>();          // provide a compile-time constant