缩小从' int'到'加倍和数组初始化

时间:2014-03-23 18:10:06

标签: c++ arrays type-conversion initializer-list narrowing

以下

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是“大型”时,它是最有效的吗?

0 个答案:

没有答案