Конструктор: это правильно называется? - PullRequest
3 голосов
/ 30 ноября 2010

По вашему мнению, какой конструктор будет называться?

class Element {
public:
    Element(bool b = true, bool c = true);
    Element(const std::string s, bool b = true, bool c = true);
};
...
Element element("something", true);

Неправильно! Первый.

Должен ли я перезапустить книгу Страуструпа с самого начала?

Я пытался без const, но ничего не меняется.

Кажется, что char * больше напоминает bool, чем std :: string.

С этим кодом все в порядке:

Element element(string("something"), true);

Компилятор: Microsoft Visual C ++ 2010

ОС: Windows 7

Ответы [ 2 ]

7 голосов
/ 30 ноября 2010

Существует встроенное преобразование типов указателей в bool, ненулевые указатели преобразуются в true, а значения нулевых указателей в false.

std::string - это пользователь.определенный тип (в самом простом смысле слова user), поэтому преобразование из const char* в std::string не будет предпочтительным по сравнению со встроенным преобразованием const char* в bool.Вы должны сделать что-то вроде этого (или добавить перегрузку, которая занимает const char *).

Element element( std::string("something"), true);
2 голосов
/ 01 декабря 2010

.

Стандарт C ++ (N1905) гласит:

$ 4,1 Стандартные преобразования неявные преобразования, определенные для встроенных Типы . Пункт 4 перечисляет полный множество таких преобразований. Стандарт последовательность преобразования представляет собой последовательность стандартные преобразования в следующем заказ:

[...]

- Ноль или одно преобразование из следующий набор: интегральные акции, продвижение с плавающей запятой, интеграл преобразования, с плавающей точкой преобразования, плавающие-интегральные преобразования указатели преобразования , указатель на преобразование членов, и логические преобразования.

[...]

$ 4,4 В общем, неявное последовательность преобразования (13.3.3.1) состоит из стандартного преобразования последовательность, сопровождаемая определяемым пользователем преобразование с последующим другим стандартная последовательность преобразования.

4.12 Булевы преобразования

$ 4.12.1. Значение арифметики, перечисления, указатель или указатель на тип элемента можно преобразовать в значение типа bool . Нулевое значение, ноль значение указателя или нулевой указатель на член значение преобразуется в false любой другое значение преобразуется в истинное значение .

13.3.3.2 Ранжирование последовательностей неявного преобразования

2 При сравнении основных форм последовательности неявного преобразования (как определено в 13.3.3.1)

- стандарт последовательность преобразования (13.3.3.1.1) представляет собой лучшая последовательность преобразования, чем определяемая пользователем последовательность преобразования или последовательность преобразования эллипса и

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

Надеюсь, это хорошо объясняет поведение, показанное вашим кодом. : -)

Кроме того, это хорошее чтение:

Последовательности неявного преобразования (только C ++)

.

...