boost::proto::deduce_domain — 一个伪域,用于需要域参数的函数和元函数。它表示父节点的域应从子节点的域推断而来。
// In header: <boost/proto/domain.hpp> struct deduce_domain { };
当 proto::deduce_domain 用作域时——无论是显式使用还是通过 proto::make_expr()、proto::unpack_expr() 或 Proto 的运算符重载隐式使用——Proto 将使用子表达式的域来计算父节点的域。计算方式如下:(A) 属于共享公共父域的域中的表达式是可互操作的,以及 (B) 属于默认域(或其子域)的表达式与所有表达式都是可互操作的。规则如下:
proto::default_domain、proto::basic_default_domain 及其所有子域都比所有其他域更弱。proto::basic_default_domain 比 proto::default_domain 更弱。proto::default_domain 或 proto::basic_default_domain 的单独集合 SN 的交集。proto::default_domain 或 proto::basic_default_domain 的单独集合 SN 的交集。proto::default_domain 或 proto::basic_default_domain 并且 U 包含一个不是 proto::default_domain 或 proto::basic_default_domain 的元素,则这是一个错误。
注意:上面的描述听起来编译时计算成本很高。事实上,这一切都可以通过 C++ 函数重载来完成。