标准库类模板std::array<T, N>
具有成员访问函数
constexpr const T& operator[]( size_type n ) const;
以及非成员访问者功能模板
template< size_t I, class T, size_t N >
constexpr const T& get( const array<T,N>& a ) noexcept
在C ++ 17中,所有operator[]
重载都已成为constexpr
,所以我想知道std::get
的剩余优势是什么(如果有的话)。例如。在这样的程序中:
int main()
{
auto a = std::array<int, 3> { 1, 2, 3 };
constexpr auto idx = 0;
std::cout << a[idx] << '\n';
std::cout << std::get<idx>(a) << '\n';
}
任何体面的编译器都应该能够为0
和operator[]
传播常量索引值get
。
问题:std::get
std::array
给operator[]
提供的好处是什么好处?
答案 0 :(得分:10)
结构化绑定需要获取。
其他通用元组代码也将使用它。
答案 1 :(得分:3)
问题:
std::get
std::array
给operator[]
提供的好处有哪些好处?
除了提供与元组的通用接口之外,显然我们在C ++中隐式一般地定义产品类型,std::get
确实还有一个优势。在编译时检查边界:
std::array<int, 3> arr;
arr[4] = 17; // bad
std::get<5>(arr) = 42; // bad, but also compile error, so actually good
这是因为如果索引超出范围,则元组接口显式格式不正确(请参阅[array.tuple]),但operator[]
只是您必须跟踪的运行时问题。