__glibcxx_function_requires和__glibcxx_requires_valid_range宏是
how does __glibcxx_function_requires and __glibcxx_requires_valid_range macros work?
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
相关文章:
- C++20 概念:如何在"requires"子句中引用类名?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 为什么 C++20 不使用"requires"来限制原子的 T<T>?
- 如何将要求降级到动态库的 glibcxx 3.4.20?
- 警告"C++ requires a type specifier for all declaration"地图
- 使用稍旧版本的 GLIBCXX
- "Feature X requires run-time support"的含义是什么?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- AWS 上的 GLIBCXX 版本错误
- 级运算符 ( "C++ requires a type specifier for all declarations" )
- 特定CXXABI和GLIBCXX版本的交叉编译
- 将 Ubuntu 交叉编译到 Centos GLIBCXX 的错误
- GLIBCXX(libstdc++.so.6)与gcc版本之间的关系
- 柯尼希查找和"C++ requires a type specifier for all declarations"
- Glibcxx 编译 FREAK OpenCV 演示文件时出错
- 运行在同一台计算机上编译的程序时,GLIBCXX版本错误
- 在概念定义中,是否允许在requires表达式之外出现替换失败
- MSVC:"use of class template requires template argument list" STL 容器内
- 错误:"explicit specialization requires 'template <>'"
- 错误"C++ requires a type specifier for all declarations"