YSTest: YBase Specified Pseudo-Keywords

YSTest PreAlpha_b900_20201012 The YSLib Test Project

宏定义
YBase Specified Pseudo-Keywords

YBase 指定的替代关键字。 更多...

## 宏定义

#define | yoffsetof(_type, _member)
| 带有静态类型检查的成员偏移计算。 更多...
#define | yforward(_expr) std::forward<decltype(_expr)>(_expr)
| 根据参数类型使用 std::forward 转发对应参数。 更多...
#define | yunseq ystdex::unsequenced
| 无序列依赖表达式组求值。 更多...
#define | yassume(_expr) (assert(_expr), void())
| 假定：环境语义。 更多...
#define | yaligned(_p, _align) (yassume(ystdex::is_aligned_ptr(_p, _align)), _p)
| 假定指定指针值按指定对齐值对齐。 更多...

## 详细描述

YBase 指定的替代关键字。

自从
  build 362

## 宏定义说明

## ◆ yaligned

#define yaligned | ( |  | _p,
|  |  | _align
| ) |  | (yassume(ystdex::is_aligned_ptr(_p, _align)), _p)

假定指定指针值按指定对齐值对齐。

参见
  yassume
  yverify
  WG21 P0886R0 。
  https://gcc.gnu.org/gcc-4.7/changes.html 。
  https://clang.llvm.org/docs/LanguageExtensions.html#builtin-functions 。
  https://bugs.llvm.org/show_bug.cgi?id=16294 。

自从
  build 864

在文件 placement.hpp 第 141 行定义.

## ◆ yassume

#define yassume | ( |  | _expr | ) | (assert(_expr), void())

假定：环境语义。

注解
  类型为 void ，以避免重载 operator, 改变表达式的求值。
  未指定表达式是否被求值。

参见
  YB_ASSUME

自从
  build 535

注解
  和普通断言相比强调非接口契约。

运行时检查的环境条件约束断言。 用于需要假设表达式求值结果为真但明确不通过接口直接约束的情形。

在文件 cassert.h 第 97 行定义.

## ◆ yforward

#define yforward | ( |  | _expr | ) | std::forward<decltype(_expr)>(_expr)

根据参数类型使用 std::forward 转发对应参数。

自从
  build 245

转发参数：按类型传递参数，保持值类别(value catrgory) 和 cv-qualifier 。 当作为宏参数的被转发表达式的类型为函数或函数引用类型时，结果为左值(lvalue) ，否则： 当且仅当被转发表达式的类型为左值引用类型时，结果为左值（此时类型不变）； 否则，结果为对应的右值引用类型的消亡值(xvalue) 。 按类型传递不能直接实现为一个具有转发引用(forwarding reference) 类型的模板参数的 函数模板匹配不同的引用然后以其实例的函数形式参数作为实际参数调用 std::forward ， 而需要使用宏实现，以确保在不同被转发表达式类型上的一致性： 转发引用类型的函数形式参数无法完全保留作为其对应函数实际参数的被转发表达式的类型 （即不按被转发表达式的类型而是其值类别推导转发引用中的模板参数， 再确定作为函数的形式参数的转发引用被实例化为左值或右值引用类型）， 于是，函数模板实例中的形式参数类型不保证和被转发表达式类型相同； 而 std::forward 转发结果类型的模板参数只能从函数模板实例的形式参数类型中取得； 因此 std::forward 使用的模板参数不能总是保证结果的值类别和被转发表达式中的类型对应， 确保左值引用类型总是转发为左值且右值引用类型总是转发为右值； 若转发对象右值引用类型的左值表达式，如按对象右值引用类型声明的变量的 id-expression 时，函数模板转发的结果总被传递为左值， 即便被转发表达式可能只能安全地绑定到右值。

在文件 ydef.h 第 1509 行定义.

## ◆ yoffsetof

#define yoffsetof | ( |  | _type,
|  |  | _member
| ) |  |

值:
(decltype(sizeof(ystdex::offsetof_check<std::is_member_object_pointer< \
decltype(&_type::_member)>::value, ynoexcept(offsetof(_type, _member)), \
_type>))(offsetof(_type, _member)))

带有静态类型检查的成员偏移计算。

参见
  ISO C++ 18.2/4 。

注解
  某些实现可直接使用 __builtin_offsetof 及 -Winvalid-offsetof 。

参见
  https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Offsetof.html 。
  https://docs.microsoft.com/cpp/cpp-conformance-improvements-2017?view=vs-2017 。
  https://reviews.llvm.org/rL46515 。
  https://bugs.llvm.org/show_bug.cgi?id=31178 。

自从
  build 325

在文件 ydef.h 第 1480 行定义.

## ◆ yunseq

#define yunseq ystdex::unsequenced

无序列依赖表达式组求值。

注解
  由于实现限制，无法用于 void 类型表达式组。
  使用一元形式 `yunsequenced((_expr))` 的形式标记表达式组 但不取消序列关系。
  支持嵌套使用。

警告
  非一元形式禁止用于产生对同一对象的未序列化的(unsequenced) 副作用 的表达式，否则存在未定义行为。
  非一元形式不适用于对顺序有依赖的表达式，包括所有可能抛出异常且对抛出 顺序敏感（例如 std::bad_cast 处理顺序不同可能造成内存泄露）的表达式。

自从
  build 266

在文件 ydef.h 第 1536 行定义.

ystdex::offsetof_check
成员偏移计算静态类型检查。
Definition: ydef.h:1442
ynoexcept
#define ynoexcept(...)
YSLib 无异常抛出保证：指定特定的异常规范。
Definition: ydef.h:1151