C++20中ConvertibleWithoutNarrowing概念里To[1]是什么意思?
关于ConvertibleWithoutNarrowing概念中To[1]的含义解释
这个概念的核心是借助C++的数组列表初始化禁止窄化转换的规则实现约束,其中To[1]的含义可以拆解为以下几点:
To[1]的本质:它代表长度为1的To类型数组。- 表达式的推导逻辑:
代码里的std::type_identity_t<To[]>{std::forward<From>(from)}是用from的值初始化一个To类型的不定长数组(To[])。在C++中,用单个值初始化不定长数组时,编译器会自动推导数组长度为1,生成To[1]类型的数组——但这个推导的前提是:from到To的转换不存在窄化,如果是窄化转换,编译器会直接拒绝这个数组初始化操作,概念约束直接不成立。 std::same_as<To[1]>的作用:它用来验证初始化后的数组类型确实是To[1],本质是间接确认From到To的转换是安全无窄化的。只有当转换合法时,数组初始化才能成功生成To[1]类型,满足这个概念的约束条件。
举个实际例子:
- 当调用
add(vec_i, 1)时,T是int,C::value_type是int,初始化int[]{1}会得到int[1],符合std::same_as<int[1]>的约束,所以编译通过。 - 当调用
add(vec_i, 1.3)时,尝试初始化int[]{1.3}会触发窄化转换错误,数组初始化失败,概念约束不满足,因此编译报错。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

