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

标签 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 is promote to double when passed through (...) 所以这意味着问题来源是采用未知数量参数的构造函数。 为什么编译器将 float 提升为 double,有没有办法解决它,或者我必须专门针对 float 版本的类,我怎么知道编译器是否也会更改其他类型...

最佳答案

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

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

关于c++ - 为什么在使用模板和 stdarg 函数时 float 被提升为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967283/

相关文章:

c++ - 如何使用屏幕坐标绘制 OpenGL 图元(GL_POINT、GL_LINE 等)?

c++ - C++ 声明和定义中的不同类型

c++ - typedef 模板声明的替代方法

C++函数指针问题

C++ 模板,在编译时解析未定义的类型

C++11 构造函数重载解析和初始化列表 : clang++ and g++ disagree

c++ - (C++) 编译时自动生成switch语句case

c++ - 如何使用 C++ 对 Arduino 进行编程

c++ - ZMQ可以在同一个线程中发布和读取吗?

c++ - 如何使用对 vector 元素的 unique_ptr 引用?