На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: JoeUser, Qraizer, Hsilgos
  
> {} и неопределенность перегрузки функций
Всем привет. Кто-то может объяснить это с т. з. Стандарта?
https://ideone.com/KiYNWi
ExpandedWrap disabled
    #include <iostream>
    #include <string>
    #include <vector>
     
    void f(const std::string& x)
    {
        std::cout << "void f(const std::string& x)";
    }
     
    void f(std::vector<int>* x)
    {
        std::cout << "void f(std::vector<int>* x)";
    }
     
    int main()
    {
        f({});
    }
Цитата TheMachine @
т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
Ну... Имеем две сигнатуры f(), одна принимает l-value const reference, вторая указатель. К первой, согласно Reference binding, может быть применено identical conversion, был бы какой-нибудь r-value типа std::string. Чтобы иметь std::string, нужен подходящий конструктор, принимающий {}. Их два: принимающий const std::string::value_type* и принимающий std::initializer_list<std::string::value_type>. Оба могут быть использованы, но для первого требуется user defined conversion, а второй identity conversion, поэтому отбирается он. Однако он имеет (List-initialization sequence) ранг worst при наличии других одинаково подходящих сигнатур.
Для второй сигнатуры {} рассматривается как value initialization, которое для указателей является zero initialization как для скалярных. Это identity conversion, которое совпадает с identity conversion для предыдущей сигнатуры, однако, т.к. для той декларируется worst, выбирается т.о. вторая сигнатура.
Одни с годами умнеют, другие становятся старше.
Qraizer, спасибо.
Цитата TheMachine @
т.е. в общем случае вы правы конечно, а мне надо спать больше а пить меньше
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0854 ]   [ 20 queries used ]   [ Generated: 19.05.19, 10:36 GMT ]