c++vectorstlstatic-caststdinitializerlist

static_cast<int> of std::initializer_list::size_type spits out "invalid conversion" error


I'm working through "A Tour of C++" by BS, and am recreating the Vector class that he uses throughout, at least the first four chapters.

I hit a snag building the second version of the Vector constructor with a std::initializer_list. A static_cast<int> is used to convert the size_type to an int so sz of my Vector can be initialized.

But, for some reason, when I try to compile it on my personal machine and OnlineGDB, I get an error:

main.cpp: In constructor 'Vector::Vector(std::initializer_list<double>)':
main.cpp:24:58: error: invalid conversion from ‘std::initializer_list::size_type {aka long unsigned int}’ to ‘double*’ [-fpermissive]
     :elem{lst.size()},  sz{static_cast<int>( lst.size() )}
                                                          ^

Why is it trying to convert the size_type to a double*? Should it not simply be converting it to a regular int?

Please see my attempt at a minimal reproducible example below.

#include <algorithm>
#include <initializer_list>

class Vector{
    double* elem;                             
    int sz;                                 
public:
    Vector(std::initializer_list<double> lst)
    :elem{lst.size()},  sz{static_cast<int>( lst.size() )}
    {
        std::copy(lst.begin(), lst.end(), elem);
    }
};

int main()
{
    Vector vec = {1.2, 1.3, 1.4};
    return 0;
}

Solution

  • Here elem{lst.size()} you are initializing a double* using a size_t.

    And why do you do static_cast<int>( lst.size() )? Your size should be of the same type as the size of the list, which is size_t, to avoid negative sizes.

    Here is your code after some editing:

    #include <initializer_list>
    #include <algorithm>
    #include <iostream>
    
    class Vector{
        size_t sz;
        double* elem;
    public:
        Vector(std::initializer_list<double> lst)
                :sz{lst.size()},  elem{new double [sz]}
        {
            std::copy(lst.begin(), lst.end(), elem);
        }
        Vector(const Vector&) = delete ;
        Vector& operator=(const Vector &) = delete ;
        size_t size()const{
            return sz;
        }
        double& operator[](size_t i){
            return elem[i];
        }
        ~Vector(){ delete [] elem;}
    };
    
    int main()
    {
        Vector vec={1.2,1.3,1.4};
        for(size_t i{}; i < vec.size(); ++i)
            std::cout << vec[i] << " ";
        return 0;
    }
    

    Live