__glibcxx_function_requires和__glibcxx_requires_valid_range宏是

how does __glibcxx_function_requires and __glibcxx_requires_valid_range macros work?

本文关键字:requires glibcxx 宏是 range function valid      更新时间:2023-10-16
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)

你能不能给我解释一下,他们是怎么工作的,他们在做什么?

_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> >();

Which内联到:

void (_InputIteratorConcept<_InputIterator>::*__x)() _IsUnused = &_InputIteratorConcept<_InputIterator>::__constraints;

这强制_InputIteratorConcept<_InputIterator>::__constraints的实例化,当_InputIterator不像迭代器时,它使用typedef s来中断编译。

__glibcxx_requires_valid_range使用类似的技术来调用几个函数中的一个,具体取决于迭代器类型。如果合适(并且足够快),它将断言__last位于__first

之后。