gsl::not_null值类型构造函数适用场景:转发构造函数失效场景探讨
gsl::not_null仅靠转发构造函数无法工作的场景
如果只保留接收转发引用的模板构造函数,以下场景会无法正常完成初始化:
传入T类型左值且T的拷贝构造为explicit时
当传入T类型的左值(比如T t;),转发构造的模板参数U会被推导为T&。此时std::is_convertible<T&, T>会返回false——因为explicit拷贝构造不允许隐式转换,导致enable_if条件不满足,转发构造函数被禁用。而第二个直接接收T的构造函数,通过直接初始化的方式可以合法调用explicit拷贝构造,完成not_null的初始化。传入const T类型左值且T的const到非const转换构造为explicit时
类似地,若传入const T左值,转发构造的std::is_convertible<const T&, T>会因转换构造为explicit而返回false,构造被禁用。第二个构造函数则可通过直接初始化调用explicit转换构造,完成初始化。
此外,当尝试通过拷贝初始化(比如not_null<T> nn = t;)构造not_null,且T的拷贝构造为explicit时,转发构造函数因隐式转换要求无法生效,而第二个构造函数也无法用于拷贝初始化(explicit构造函数不支持隐式拷贝初始化),但这种情况本质上是explicit构造的语言特性,而非仅缺失转发构造的问题。
内容的提问来源于stack exchange,提问作者user3882729
相关产品推荐
相关产品推荐

