Нулевая инициализация `std :: array` арифметического` value_type` во время компиляции приводит к отсутствующей заметке конструктора - PullRequest
0 голосов
/ 27 февраля 2019

Чтобы инициализировать std::array арифметического типа AT во время компиляции, я сделал это:

#include <array> 
#include <iostream>

template<typename AT, auto DIM, auto N = 0> 
constexpr void assign(std::array<AT, DIM>& arr, AT value)
{
    arr[N] = value; 
    if constexpr (N < std::size(arr) - 1)
        assign<AT, DIM, N + 1>(arr, value);
}

template<typename AT, auto DIM>
constexpr std::array<AT, DIM> zero_array() 
{
    std::array<AT, DIM> result;  
    assign(result, AT{0});
    return result;
}

template<typename Container> 
void print(Container&& cont)
{
    for (const auto& el : cont)
        std::cout << el << " "; 
    std::cout << std::endl;
}

int main()
{
    auto zero10 = zero_array<double, 10>(); 
    print(zero10); 
}

Я проколол его , и мне кажется, этосработало:

enter image description here

Однако, когда я скомпилировал его с

g++  -O3 -std=c++2a -Wall -Wpedantic -Wunused-parameter -I /usr/include main.cpp -o main

, используя g++ (GCC) 8.2.1 20181127, я получил «заметку»

In file included from main.cpp:1:
main.cpp: In instantiation of ‘constexpr std::array<AT, DIM> zero_array() [with AT = double; auto DIM = 10]’:
main.cpp:30:42:   required from here
/usr/include/c++/8.2.1/array:94:12: note: ‘struct std::array<double, 10>’ has no user-provided default constructor
     struct array
            ^~~~~
/usr/include/c++/8.2.1/array:110:56: note: and the implicitly-defined constructor does not initialize ‘double std::array<double, 10>::_M_elems [10]’
       typename _AT_Type::_Type                         _M_elems;

Почему эта записка там?Могу ли я игнорировать это?Если так, как от этого избавиться?

1 Ответ

0 голосов
/ 27 февраля 2019

std::array не имеет конструктора по умолчанию.Вам нужно использовать:

std::array<AT, DIM> result = {};

Меня удивляет, почему вы думаете, что вам вообще нужно zero_array.Если вы используете

std::array<double, 10> a = {};

, вы получите инициализированный нулем объект.

...