空元组的转换构造函数

时间:2019-06-01 06:10:16

标签: c++ tuples language-lawyer c++17 standard-library

(除非另有说明,否则此问题针对C ++ 17。)

如果有一个空的元组(std::tuple<>),则永远不会调用转换构造函数,因为非模板函数始终优先于模板实例化。

[tuple.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.cnstr]

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时应禁用转换构造函数。在实现中忽略它是安全的。我的分析正确吗?

0 个答案:

没有答案