我正在研究如何使用演绎指南。我编写了这个程序。
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,符合我之前的预期。比较这两个程序,唯一的区别是结构体的初始化方式。推导指南与聚合初始化配合不好怎么办?谢谢。
在第一种情况下,允许代码编译的是
()
中的main
初始化,它允许将double
转换为std::size_t
。如果您使用了 {}
初始化,则程序根本无法编译,这表明您正在尝试使用未声明的构造函数。事实上,即使使用您的原始代码,Clangd 也会用消息警告我 Implicit conversion from 'double' to 'unsigned long' changes value from 1.2 to 1 [-Wliteral-conversion]
。
对于第二种情况,您确实已经声明了一个与 CTAD 匹配的构造函数。