Очень приятно слышать, что мы больше не нуждаемся в повторном объявлении! Я проверил с 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;
}
}