2010-11-30 4 views
3

На ваш взгляд, какой конструктор будет называться?Конструктор: это правильный вызов?

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

+0

Вы, кажется, ответили на свой вопрос в редакции. Есть ли здесь (другой) реальный вопрос? – 2010-11-30 17:06:40

+1

сторона примечание: не пропустите `std :: string` значение; Ссылка const здесь, вероятно, более эффективна. – tenfour 2010-11-30 17:07:53

+0

tenfour: да, ссылка const - это то, что я использовал в начале. Я попытался удалить ссылку, чтобы увидеть, улучшилось ли положение. – Pietro 2010-11-30 17:11:02

ответ

7

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

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

Element element(std::string("something"), true); 
2

.

C++ Standard (N1905) говорит,

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

[...]

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

[...]

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

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

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

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

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

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

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

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

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

Implicit conversion sequences (C++ only)

.

Смежные вопросы