constexpr c конкатенация строк, параметры, используемые в контексте constexpr

Я изучал, как далеко я могу взять конкатенацию constexpr char const * из этого ответа: constexpr для объединения двух или более строк символов

У меня есть следующий код пользователя, который точно показывает, что я пытаюсь сделать. Кажется, что компилятор не видит, что параметры функции (a и b) передаются как constexpr.

Может ли кто-нибудь увидеть способ заставить те два, которые я указываю ниже, не работать, а действительно работать? Было бы чрезвычайно удобно иметь возможность комбинировать массивы символов с помощью подобных функций.

template<typename A, typename B>
constexpr auto
test1(A a, B b)
{
  return concat(a, b);
}

constexpr auto
test2(char const* a, char const* b)
{
  return concat(a, b);
}

int main()
{
  {
    // works
    auto constexpr text = concat("hi", " ", "there!");
    std::cout << text.data();
  }
  {
    // doesn't work
    auto constexpr text = test1("uh", " oh");
    std::cout << text.data();
  }
  {
    // doesn't work
    auto constexpr text = test2("uh", " oh");
    std::cout << text.data();
  }
}

ЖИВОЙ пример


person Short    schedule 29.08.2016    source источник


Ответы (1)


concat нужен const char (&)[N], и в обоих случаях тип будет const char*, поэтому вы можете изменить свою функцию следующим образом:

template<typename A, typename B>
constexpr auto
test1(const A& a, const B& b)
{
  return concat(a, b);
}

Демо

person Jarod42    schedule 29.08.2016