Почему строка в кавычках соответствует сигнатуре метода bool перед std :: string? - PullRequest
14 голосов
/ 19 июля 2009

Учитывая следующие методы:

// Method 1
void add(const std::string& header, bool replace);

//Method 2
void add(const std::string& name, const std::string& value);

Может показаться, что следующий код вызовет метод 1 вместо метода 2:

something.add("Hello", "World");

В итоге я создал еще один метод, который выглядит следующим образом:

//Method 3
void MyClass::add(const char* name, const char* value) {
    add(std::string(name), std::string(value));
}

Это сработало. Поэтому может показаться, что когда метод принимает «строку в кавычках», он будет соответствовать в следующем порядке:

  1. const char*
  2. bool
  3. std::string

Почему строка в кавычках должна обрабатываться как bool перед std::string? Это обычное поведение? Я написал приличное количество кода для этого проекта, и у меня не было других проблем с неправильной подписью метода ...

Ответы [ 3 ]

14 голосов
/ 19 июля 2009

Я предполагаю, что преобразование из указателя в bool является неявным преобразованием примитивного типа, где преобразование в std::string требует вызова конструктора и создания временного.

9 голосов
/ 19 июля 2009

В вашем случае у вас есть перегруженные функции. Разрешение перегрузки происходит в соответствии с разделом 13.3.

C ++ 03 13.3.3.2/2:

При сравнении основных форм последовательностей неявного преобразования (как определено в 13.3.3.1)
- стандартная последовательность преобразования (13.3.3.1.1) является лучшей последовательностью преобразования, чем определенная пользователем последовательность преобразования или последовательность преобразования с многоточием, и
- определяемая пользователем последовательность преобразования (13.3.3.1.2) является лучшей последовательностью преобразования, чем последовательность преобразования эллипса (13.3.3.1.3).

Указатель преобразования в bool является стандартным преобразованием. Указатель преобразования в std :: string является определяемым пользователем преобразованием.

4.12 Булевы преобразования Значение арифметики, перечисления, указатель или указатель на тип элемента может быть преобразовано в значение типа bool . Нулевое значение, нулевое значение указателя или нулевое значение указателя члена преобразуется в ложь; любое другое значение преобразуется в true.

6 голосов
/ 19 июля 2009

Указатели имеют неявное преобразование в bool. Возможно, вы видели следующее:

void myFunc(int* a)
{
    if (a)
        ++(*a);
}

Теперь в C ++ неявные преобразования между встроенными типами имеют приоритет над преобразованиями между типами классов. Так, например, если у вас был класс:

class Int
{
public:
    Int(int i) {}
}

И вы перегрузили функцию для long и Int:

void test(long n) {cout << "long";}
void test(Int n) {cout << "Int";}

Вы увидите, что следующий код вызывает длинную перегрузку:

int i;
test(i);
...