Namespaces
Variants

std::experimental::ranges:: swap

From cppreference.net
namespace {

constexpr /* 未指定 */ swap = /* 未指定 */ ;

}
(ranges TS)
(定制点对象)
调用签名
template < class T, class U >

requires /* 见下文 */

void swap ( T && t, U && u ) noexcept ( /* 见下文 */ ) ;

交换 t u 所引用的值。

ranges::swap 的调用等价于:

1) ( void ) swap ( std:: forward < T > ( t ) , std:: forward < U > ( u ) ) ,若该表达式合法,其中 重载决议 使用以下候选函数执行:
  • template < class T > void swap ( T & , T & ) = delete ;
  • template < class T, std:: size_t N > void swap ( T ( & ) [ N ] , T ( & ) [ N ] ) = delete ;
  • 通过 实参依赖查找 找到的任何 swap 声明。
若通过重载决议选择的函数未交换 t u 所引用的值,则程序非良构;不要求诊断。
2) 否则, ( void ) ranges:: swap_ranges ( t, u ) ,若 T U 是等长度数组类型(但元素类型可能不同)的左值引用,且 ranges:: swap ( * t, * u ) 是合法表达式。
3) 否则,若 T U 均为满足 MoveConstructible < V > Assignable < V & , V > 语法要求的类型 V V& ,则交换被引用的值,如同执行 V v { std :: move ( t ) } ; t = std :: move ( u ) ; u = std :: move ( v ) ; 。若任一概念的语义要求未被满足,则程序非良构;不要求诊断。
4) 在所有其他情况下,调用 ranges::swap 均属于病式结构。

ranges:: swap 若其所调用的每个函数(按上述规范)均能在常量表达式中使用,则其自身亦可用于常量表达式。

目录

定制点对象

名称 ranges::swap 表示一个 定制点对象 ,它是一个字面量 Semiregular 类类型(为说明方便,记作 SwapT )的 函数对象 SwapT 的所有实例都是等价的。因此, ranges::swap 可以被自由复制,其副本可以互换使用。

给定一组类型 Args... ,若 std:: declval < Args > ( ) ... 满足前述对 ranges::swap 参数的要求,则 SwapT 将满足 ranges :: Invocable < const SwapT, Args... > 。否则, SwapT 的函数调用运算符均不参与重载决议。

在每个定义了 ranges::swap 的翻译单元中,它都指向同一个定制点对象实例。(这意味着它可以自由用于内联函数和函数模板等场景,而不会违反 单一定义规则 。)

异常

1)
noexcept 规范:
noexcept ( noexcept ( ( void ) swap ( std:: forward < T > ( t ) , std:: forward < T > ( u ) ) ) )
,其中 swap 按上述方式查找获得。
2)
noexcept 规范:
noexcept ( noexcept ( ranges:: swap ( * t, * u ) ) )
3)
noexcept 规范:

示例

参见

交换两个对象的值
(函数模板)