Очень приятно слышать, что мы больше не нуждаемся в повторном объявлении! Я проверил с gcc 7.1.0 / C ++ 17 и да, я просто могу удалить определение. Поэтому я переключу все свои проекты на c ++ 17 :-) Язык движется в правильном направлении!

я хочу использовать некоторые удобные вещи, такие какmake_array У меня нет шансов объявить мой массив первым, а затем сделать определение, как было сделано в «более ранние» времена, потому что тип моей переменной недоступен до определения.

Итак, я нашел этот ответ:
Неопределенная ссылка на статический constexpr char []

В следующем примере я написал это решение, которое прекрасно компилируется с gcc, и я не уверен, что это действительно правильный код c ++, потому что это более или менее объявление с определением, а затем определение без какого-либо содержимого. Это разрешено? (Прекрасная компиляция не является гарантией того, что код действителен c ++)

#include <experimental/array>
#include <iostream>

class Foo
{
    private:
    static decltype(auto) constexpr Bar =
        std::experimental::make_array(
            std::experimental::make_array( 1,2,3 ),
            std::experimental::make_array( 4,5,6 )
            );

    public:
    using ARR_TYPE = decltype( Bar );

    static auto& GetArr( int idx )
    {
        // range check ...
        return Bar[idx];
    }
};

constexpr Foo::ARR_TYPE Foo::Bar;

int main()
{
    for ( auto el: Foo::GetArr(0))
    {
        std::cout << el << std::endl;
    }
 }

Ответы на вопрос(1)

Ваш ответ на вопрос