以下
int i = 0;
double d{i};
给出narrowing conversion from 'int' to 'double'
的错误(在clang中)或警告(在gcc中)。我发现这真的很窄,至少在我看到narrowing conversion from unsigned to double之前,我感到很惊讶。
我的实际问题源自一个包含数组的类,并以最简单的方式提供用于指定数组元素的构造函数(转发):
template<typename T, size_t N>
struct A
{
T a[N];
template<typename... E>
A(E&&... e) : a{std::forward<E>(e)...} { }
};
在这种情况下,我们有以下(live example):
int i = 0;
A<double, 2> x(i, 2); // ERROR for both 'i' and '2'
double y[2]{i, 2}; // ERROR for 'i' only
其中ERROR
指的是如上所述缩小转化率。我怀疑所有这些错误都归结为开头提到的错误(double d{i};
)。是这样吗?不然,发生了什么?
无论如何,我真的很喜欢
A<double, 2> x(i, 2);
完全正常工作
double x(i);
的工作原理。不幸的是,我只能使用初始化列表初始化数组,该列表还会检查缩小的转换。我知道一个解决方法是在构造函数中进行显式转换:
template<typename... E>
A(E&&... e) : a{static_cast <T>(e)...} { }
或(感谢Marc)
template<typename... E>
A(E&&... e) : a{static_cast <T>(std::forward<E>(e))...} { }
但这是“正确的”方式吗?当E
是“大型”时,它是最有效的吗?