2016-08-29 23 views
5

ja badał, jak daleko mogę wziąć const constexpr char * powiązanie z tej odpowiedzi: constexpr to concatenate two or more char stringsconstexpr c ciąg konkatenacji, parametry stosowane w kontekście constexpr

Mam następujący kod użytkownika, który pokazuje dokładnie to, co ja” Próbuję to zrobić. Wydaje się, że kompilator nie widzi, że parametry funkcji (a i b) są przekazywane jako constexpr.

Czy ktoś może zobaczyć sposób, w jaki te dwie, które wskazuję, nie działają poniżej, faktycznie działają? Byłoby niezwykle wygodnie móc łączyć tablice znaków za pomocą takich funkcji.

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(); 
    } 
} 

LIVE example

Odpowiedz

4

concat potrzeba const char (&)[N], aw obie sprawy, rodzaj będzie const char*, więc może zmienić swoją funkcję jako:

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

Demo

Powiązane problemy