我不得不编写C ++ 11代码,但我想使用std::cbegin()
。所以,我正在考虑GCC 5.4.0的实现,在我的系统/usr/include/c++/5/bits/range_access.h
上,认为我可能会写类似的东西,我看到了:
template<class _Container>
inline constexpr auto
cbegin(const _Container& __cont) noexcept(noexcept(std::begin(__cont)))
-> decltype(std::begin(__cont))
{ return std::begin(__cont); }
这就是它的全部内容吗?我错过了什么吗?如果就是这样,为什么它不像std::begin()
那样不是C ++ 11的一部分?
答案 0 :(得分:2)
这就是它的全部内容吗?
是
我错过了什么吗?
不是我意识到的。
如果是这样的话,为什么它不像std :: begin()那样成为C ++ 11的一部分?
全局模板似乎已成为原始提案的一部分,作为成员函数的替代方案,但该提案倾向于仅提供成员函数,而不仅仅提供全局模板,或同时提供模板和成员。 (假设这是原始提案:N1674)。
委员会选择在C ++ 11中包含成员函数替代,并且模板直到C ++ 14。我不是委员会成员,也不能代表他们,但我的猜测是提案的态度可能影响了决定:
虽然这种通用适配器替代方案似乎非常简单,但我们仍然赞成 上面提出的成员函数方法。它似乎更符合当前的C ++ 编程习语,如并行使用 rbegin 作为容器成员的功能而不是 而不是通用适配器
以下是C ++标准库缺陷报告issue (2128)的开发,其中模板版本决定在C ++ 14中被采用。
答案 1 :(得分:0)
不,这涵盖了它。
虽然可以用相对较少的努力将一个小功能添加到标准中,但时间是有限的,委员会没有无限的资源。在C ++ 14之前省略的另一个合理有用且简单的函数的例子是std::make_unique
。随着时间的推移,事情会有所改善。