почему компилятор выбирает bool вместо string_view, когда ему присваивается const char * в качестве типа шаблонного аргумента? - PullRequest
3 голосов
/ 24 мая 2019
#include <iostream>

struct A
{
    void update(bool const & v)
    {
        std::cout << std::boolalpha << v << std::endl;
    }

    void update(std::string_view v)
    {
        std::cout << v << std::endl;
    }
};


template <typename T>
void update(T const & item)
{
    A a;
    a.update(item);
}


int main()
{
    const char * i = "string";
    update(i);
}

когда я вызываю update с const char *, компилятор вызывает функцию с аргументом bool вместо string_view?!почему ??!

1 Ответ

6 голосов
/ 24 мая 2019

Преобразование из const char * в std::string_view (через конструктор из std::string_view) - это пользовательское преобразование; что хуже, чем стандартное преобразование ( неявное преобразование из const char* в bool) в разрешении перегрузки .

1) Стандартная последовательность преобразования всегда лучше, чем определенная пользователем последовательность преобразования или многоточия преобразования.

...