Строковый литерал должен быть выведен как константный массив символов, а затем он распадается на указатель const char*. Вот почему это работает:
struct MyStringView
{
template <int N>
MyStringView(const char(&arr)[N]) : str(&arr[0]), size(N - 1){
}
const char* str;
int size;
};
MyStringView getName(int number)
{
switch (number)
{
case 1: return "One";
case 2: return "Two";
case 3: return "Three";
}
}
int main()
{
auto string_view = getName(1);
}
Хотя у MyStringView нет конструктора, принимающего const char*.
Но это не работает:
template <bool bAsInteger>
MyStringView getName2(int number)
{
switch (number)
{
// RETURN CANNOT CONVERT FROM CONST CHAR* TO MyStringView
// HOWEVER return bAsInteger ? MyStringView("1") : MyStringView("One") works
case 1: return bAsInteger ? "1" : "One";
case 2: return bAsInteger ? "2" : "Two";
case 3: return bAsInteger ? "3" : "Three";
}
}
int main()
{
string_view = getName2<true>(1);
}
Почему это не работает? Почему он сейчас ищет const char* конструктор?





Потому что возвращаемый тип условного оператора будет общим типом, выведенным из его операндов.
Для bAsInteger ? "1" : "One" операндами являются "1" (const char[2]) и "One" (const char[4]), тогда общий тип выводится как const char *. Таким образом, bAsInteger ? "1" : "One" всегда возвращает const char*, который позже используется для построения MyStringView.
Забавно, но работает следующее: случай 1: return bAsInteger? «111»: «Один»; случай 2: вернуть bAsInteger? «222»: «Два»; случай 3: вернуть bAsInteger? «33333»: «Три»;