首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++20中的CTAD和指定的初始化器

C++20中的CTAD和指定的初始化器
EN

Stack Overflow用户
提问于 2019-09-11 09:58:42
回答 1查看 655关注 0票数 10

我已经在这个question中声明了关于CTAD与指定的初始化器的混淆,但是我对一个非常类似的代码片段有另一个混淆。

代码语言:javascript
复制
template <typename int_t=int, typename float_t=float>
struct my_pair {
    int_t   first;
    float_t second;
};

template<typename ... ts>
my_pair(ts...) -> my_pair<ts...>;

int main() {
    my_pair x{.second = 20.f};
    static_assert( std::is_same_v<decltype(x.first), int> ); //FAILS <- its deduced to float
    static_assert( std::is_same_v<decltype(x.second), float> );
}

虽然我没有在指定的初始化器中给出一个显式的first,但似乎演绎指南会将float的类型导出为float。显然,演绎指南只关心初始化器中的顺序,而不管关键字(.second)。扣减指南是聪明的还是应该有“指定的扣减指南”?

参见https://godbolt.org/z/cm6Yi7上的示例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-11 12:34:31

this answer为起点。我们有相同的最初三名候选人:

代码语言:javascript
复制
template <class T=int, class U=float>
struct my_pair {
    T first;
    U second;
};

// default constructor
template <class T=int, class U=float>
auto __f() -> my_pair<T, U>;

// copy candidate
template <class T=int, class U=float>
auto __f(my_pair<T, U>) -> my_pair<T, U>;

// deduction guide
template <class... T>
auto __f(T...) -> my_pair<T...>;

聚合扣除候选项是基于我们提供的实际初始化项列表或指定初始化项列表,而不是聚合的实际底层成员。我们指定的初始化项列表是{.second = 20.f},因此我们的累计扣减候选项变成:

代码语言:javascript
复制
// aggregate deduction candidate
template <class T=int, class U=float>
auto __f(U) -> my_pair<T, U>;

模板参数总是来自主类模板,因此我们从那里引入默认的模板参数。候选参数来自初始化程序列表,second的类型为U

聚合演绎候选是最好的候选(只有累计演绎候选和演绎指南是可行的,累计演绎候选更专业),所以我们最终使用my_pair<int, float>

在完成CTAD之后,我们现在重新开始并有效地完成

代码语言:javascript
复制
my_pair<int, float> x{.second = 20.f};

它可以工作,并导致从x.first初始化{}

关于总量的CTAD直到最近才获得通过(在两个月前的2019年7月科隆会议上)。在此之前,这一功能仍将是完善的:

代码语言:javascript
复制
my_pair{.second = 20.f};

为什么?我们还没有累计的扣除候选,但我们仍然有扣除指南.这是可行的。它给了我们my_pair<float>。也就是说,一旦您为my_pair<float, float>填充了默认的模板参数,就可以使用U

这就是为什么gcc给了你你看到的行为--它还没有为聚合实现CTAD,而是给了你旧的行为。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57886648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档