template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
inline _Tp
accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op)
{
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
__glibcxx_requires_valid_range(__first, __last);
for (; __first != __last; ++__first)
__init = __binary_op(__init, *__first);
return __init;
}我查看了stl库中的累加函数的定义。我在这里找到了两个宏__glibcxx_function_requires和__glibcxx_requires_valid_range,它们的定义如下:
#define __glibcxx_function_requires(...)
# define __glibcxx_requires_valid_range(_First,_Last)请你给我解释一下,它们是如何工作的,它们在做什么?
发布于 2013-04-11 05:00:05
当定义了_GLIBCXX_CONCEPT_CHECKS时,它也是如此。
#define __glibcxx_function_requires(...) \
__gnu_cxx::__function_requires< __gnu_cxx::__VA_ARGS__ >();所以你发布的代码是:
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)解析为:
__gnu_cxx::__function_requires< _InputIteratorConcept<_InputIterator> >();它内联到:
void (_InputIteratorConcept<_InputIterator>::*__x)() _IsUnused = &_InputIteratorConcept<_InputIterator>::__constraints;这强制了_InputIteratorConcept<_InputIterator>::__constraints的实例化,当_InputIterator不像迭代器时,它使用typedefs来中断编译。
__glibcxx_requires_valid_range使用类似的技术来调用one of several函数,具体取决于迭代器类型。在适当的时候(并且足够快),它将断言__last位于__first之后
https://stackoverflow.com/questions/15935471
复制相似问题