У меня есть немного кода, который использует ссылки на массивы символов constexpr в качестве аргументов шаблона. Оказывается, что новые версии MSVC не могут скомпилировать .
Но у него нет проблем , если я изменю код на передачу массива по значению, которое выглядит следующим образом:
#include <cstddef>
#include <type_traits>
#include <utility>
template <char... Cs>
struct char_sequence {};
template <std::size_t N, const char (s)[N], typename T>
struct make_char_sequence_impl;
template <std::size_t N, const char (s)[N], std::size_t... i>
struct make_char_sequence_impl<N, s, std::index_sequence<i...>> {
using type = char_sequence<s[i]...>;
};
template <std::size_t N, const char (Input)[N]>
using make_char_sequence =
typename make_char_sequence_impl<N, Input,
std::make_index_sequence<N - 1>>::type;
struct Delta {
struct _alias_t {
static constexpr const char _literal[] = "delta";
using _name_t = make_char_sequence<sizeof(_literal), _literal>;
};
};
Согласно cppreference :
Массивы и типы функций могут быть записаны в объявлении шаблона, но они автоматически заменяются указателем на объект и указателем на функцию в зависимости от ситуации.
Но если параметр Input
является указателем в make_char_sequence
, то как его можно передать в make_char_sequence_impl
, который ожидает массив определенного размера? Это законно C ++?