模板推导指南不适用于聚合初始化

问题描述 投票:0回答:1

我正在研究如何使用演绎指南。我编写了这个程序。

template<typename T>
struct Test {
    void f() {
        cout << std::is_same_v<T, std::size_t> << endl;
    }
    T t;
};

Test(int) -> Test<std::size_t>;

int main() {
    Test t1(1.2);
    t1.f();
}

我预计只有当我将整数传递给聚合初始化时,推导指南才会启动。由于我通过了1.2,我预计T会被扣除双倍,这不会触发扣除指南。然而输出是 1,即 T -> int -> size_t。

我尝试向结构添加构造函数。

template<typename T>
struct Test {
    void f() {
        cout << std::is_same_v<T, std::size_t> << endl;
    }
    Test(T v): t(v) {}
    T t;
};

Test(int) -> Test<std::size_t>;

int main() {
    Test t1(1.2);
    t1.f();
}

输出为0,符合我之前的预期。比较这两个程序,唯一的区别是结构体的初始化方式。推导指南与聚合初始化配合不好怎么办?谢谢。

c++ templates template-argument-deduction
1个回答
0
投票

在第一种情况下,允许代码编译的是

()
中的
main
初始化,它允许将
double
转换为
std::size_t
。如果您使用了
{}
初始化,则程序根本无法编译,这表明您正在尝试使用未声明的构造函数。事实上,即使使用您的原始代码,Clangd 也会用消息警告我
Implicit conversion from 'double' to 'unsigned long' changes value from 1.2 to 1 [-Wliteral-conversion]                                                                                                                                              

对于第二种情况,您确实已经声明了一个与 CTAD 匹配的构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.