首页 > 解决方案 > 为什么 CTAD 不适用于结构内的模板化数据成员

问题描述

我有一个用于学习目的的类pair_wrapper模板:std::pair

template <typename F, typename S>
struct pair_wrapper {
  std::pair<F, S> member_pair;
};

其中:

pair_wrapper{{1, 2.0}}; // does not work
pair_wrapper<int, double>{{1, 2.0}}; // but does work

或者强迫我这样做:

pair_wrapper{std::pair{1, 2.0}}; // but this also works

或者使用自定义推导指南创建自定义构造函数:

...
template <typename T, typename U>
pair_wrapper(T&& t, U&& u)
: p{std::forward<T>(t), std::forward<U>(t)} {}
...

template <typename F, typename S>
pair_wrapper(F, S) -> pair_wrapper<F, S>;

去做:

pair_wrapper{1, 2.0};

我的问题是:为什么我不能直接推断出数据成员的模板参数,例如pair_wrapper{{1, 2.0}}该类型pair_wrapper是否被视为聚合

标签: c++ctad

解决方案


推荐阅读