(除非另有说明,否则此问题针对C ++ 17。)
如果有一个空的元组(std::tuple<>
),则永远不会调用转换构造函数,因为非模板函数始终优先于模板实例化。
namespace std {
template <class... Types>
class tuple {
public:
// ...
tuple(const tuple&) = default; // copy constructor
// ...
template <class... UTypes>
EXPLICIT constexpr tuple(const tuple<UTypes...>&); // converting constructor
// ...
};
// ...
}
tuple(const tuple& u) = default;
11 要求:
is_copy_constructible_v<Ti>
是 对于所有 i 都是如此。12 效果:用
*this
的相应元素初始化u
的每个元素。[...]
template <class... UTypes> EXPLICIT constexpr tuple(const tuple<UTypes...>& u);
15 效果:用
*this
的相应元素初始化u
的每个元素。16 备注:除非
,否则此构造方法不得参与重载解析。
sizeof...(Types) == sizeof...(UTypes)
和- 都是正确的
is_constructible_v<Ti, const Ui&>
对于所有 i 和
sizeof...(Types) != 1
,或者(当Types...
扩展为T
并且UTypes...
扩展为U
时)!is_convertible_v<const tuple<U>&, T> && !is_constructible_v<T, const tuple<U>&> && !is_same_v<T, U>
为true
。当且仅当构造器为
explicit
is_convertible_v<const Ui&, Ti>
在至少一个 i 中为假。
据我了解,在sizeof...(Types) == 0
时应禁用转换构造函数。在实现中忽略它是安全的。我的分析正确吗?