使用模板和stdarg函数时为什么float被提升为double

时间:2014-07-26 03:36:07

标签: c++ templates

我制作了一个模板类数组: 这是必要的代码:

#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
#include <cstdarg>

template< typename T >
class Array
{
public:
    Array(size_t length = 0, ...);
    ~Array();
private:
    T *m_values;
    size_t m_len;
};

template< typename T>
Array< T >::Array(size_t len, ...) : m_values(0), m_len(len)
{
    if(len != 0)
    {
        m_values = new T[len];
        va_list ap;
        va_start(ap, len);
        for(size_t i(0); i < len; i++)
            m_values[i] = va_arg(ap, T);
        va_end(ap);
    }
    else
        m_values = NULL;
}

template< typename T >
Array< T >::~Array()
{
    delete[] m_values;
}

#endif // ARRAY_H

这是我的主要

int main()
{
    Array<float> a;
    return 0;
}

当我编译时,我得到一个警告“浮动在传递时被提升为双倍(...) 这意味着问题源是采用未知数量参数的构造函数。 为什么编译器会将float提升为double,有没有办法解决它,或者我必须专门为float版本设置类,我怎么知道编译器是否也会改变其他类型......

1 个答案:

答案 0 :(得分:4)

当调用具有可变长度参数列表的函数时,使用C&#39的旧默认参数提升传递变量参数。这些表示类型charshort int会自动提升为int类型float会自动提升为double

因此,varargs函数绝不能接收charshort intfloat类型的参数。