Автоматическое преобразование из double / int / string в bool в C ++ - PullRequest
2 голосов
/ 21 декабря 2011

Я программист на Java, который пытается немного изучить C ++, чтобы расширить свои знания. Вот небольшой фрагмент кода, который я думаю работает из-за неявного преобразования, но я хотел бы знать, на какую часть спецификации он ссылается и каковы другие правила, о которых я должен знать, когда он приходит к неявному преобразованию. Есть ли документ / ссылка / сайт, в котором изложены правила неявного преобразования?

#include <vector>
#include <iostream>
#include <iterator>

int main(void) {
  using namespace std;
  vector<bool> a;
  a.push_back("asdf");
  a.push_back("");  
  a.push_back(12);  
  a.push_back(0.0);  
  copy(a.begin(), a.end(), ostream_iterator<bool>(cout, "\n"));
  return 0;
}

/*
output:

1
1
1
0
*/

ТИА
Sasuke

Ответы [ 2 ]

9 голосов
/ 21 декабря 2011

Указатели и целые числа, а также логические значения, являются целочисленными типами .Первые три являются либо указателями, либо целыми числами, и, поскольку они не равны нулю, они преобразуются в логическое значение true.Четвертое значение типа double преобразуется в нулевое интегральное значение и, следовательно, false.

Преобразование двойных чисел, которые не могут быть представлены в виде интегральных значений (таких как бесконечность и NaN), не определено.

Подробные сведения см. В 4.9, а также в разделе 4.12 для "Булевых преобразований":

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

Ваш 0.0 является арифметическим типом нулевого значения.

Возможно, вы не знакомы со строковыми литералами в C ++: ""обозначает массив char[1] { 0 }, и этот массив (из одного элемента) превращается в указатель на его первый элемент, который обязательно является ненулевым указателем.Аналогично, «asdf» обозначает массив char[5] { 'a', 's', 'd', 'f', 0 }, и снова это превращается в (ненулевой) указатель на его первый элемент.Фактическое значение символов совершенно несущественно.

2 голосов
/ 21 декабря 2011

Все базовые типы могут быть неявно преобразованы в bool.Все, что не 0, равно TRUE, а 0 равно FALSE.

. Для пользовательских типов, если вы используете указатели, все, что не NULL, оценивается как TRUE, в противном случаеFALSE.

Если вы используете экземпляры объектов, а не указатели, вам нужно объявить operator bool():

class A
{
public:
   operator bool() {return false;};
};

//....

A a;
if ( a ) //compiles because of the operator
   //...;
...