使用std :: get on std :: array可以提供更好的性能吗?

时间:2017-06-11 17:29:15

标签: c++ arrays performance get c++17

标准库类模板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';
}

任何体面的编译器都应该能够为0operator[]传播常量索引值get

问题std::get std::arrayoperator[]提供的好处是什么好处?

2 个答案:

答案 0 :(得分:10)

结构化绑定需要获取。

其他通用元组代码也将使用它。

答案 1 :(得分:3)

  

问题:std::get std::arrayoperator[]提供的好处有哪些好处?

除了提供与元组的通用接口之外,显然我们在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[]只是您必须跟踪的运行时问题。