首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__glibcxx_function_requires和__glibcxx_requires_valid_range宏是如何工作的?

__glibcxx_function_requires和__glibcxx_requires_valid_range宏是如何工作的?
EN

Stack Overflow用户
提问于 2013-04-11 04:10:50
回答 1查看 1.5K关注 0票数 10
代码语言:javascript
复制
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,它们的定义如下:

代码语言:javascript
复制
#define __glibcxx_function_requires(...)
# define __glibcxx_requires_valid_range(_First,_Last)

请你给我解释一下,它们是如何工作的,它们在做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-11 05:00:05

当定义了_GLIBCXX_CONCEPT_CHECKS时,它也是如此。

代码语言:javascript
复制
#define __glibcxx_function_requires(...)                                 \
         __gnu_cxx::__function_requires< __gnu_cxx::__VA_ARGS__ >();

所以你发布的代码是:

代码语言:javascript
复制
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)

解析为:

代码语言:javascript
复制
__gnu_cxx::__function_requires< _InputIteratorConcept<_InputIterator> >();

它内联到:

代码语言:javascript
复制
void (_InputIteratorConcept<_InputIterator>::*__x)() _IsUnused = &_InputIteratorConcept<_InputIterator>::__constraints;

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

__glibcxx_requires_valid_range使用类似的技术来调用one of several函数,具体取决于迭代器类型。在适当的时候(并且足够快),它将断言__last位于__first之后

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15935471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档