Почему первая функция работает, а вторая нет?

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

Забавно, но работает следующее: случай 1: return bAsInteger? «111»: «Один»; случай 2: вернуть bAsInteger? «222»: «Два»; случай 3: вернуть bAsInteger? «33333»: «Три»;

Mike Vine 17.05.2024 10:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Потому что возвращаемый тип условного оператора будет общим типом, выведенным из его операндов.

Для bAsInteger ? "1" : "One" операндами являются "1" (const char[2]) и "One" (const char[4]), тогда общий тип выводится как const char *. Таким образом, bAsInteger ? "1" : "One" всегда возвращает const char*, который позже используется для построения MyStringView.

Другие вопросы по теме