Как массив символов работает как аргумент шаблона? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть немного кода, который использует ссылки на массивы символов 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 ++?

...