Как string преобразуется в bool?

 

Как преобразуется string в bool вот в таком коде? Я ожидал, будет хотя бы варнинг, однако проглотило без замечаний. Собственно, почему пишу, по ошибке вместо bool послал в функцию _Symbol и потом долго искал, где ошибка. 

Такой код нормален или нет?

PS: я в курсе, что false == 0, а true - любое значение, отличное от нуля. Но вот с такой интерпретацией строки... Кстати, пустая строка распознается, как false. Но ведь она же и пустая - объект?

void OnStart()
{
    string s = "qwerty";
    if(TestBool(s))
        Print("TestBool==true");
    else      
        Print("TestBool==false");

    if(s)
        Print("s==true");
    else      
        Print("s==false");
}

bool TestBool(bool b)
{
    return b;
}

***
 

 

Написал бы что принтит этот код, для наглядности

Я думаю что лучше не засовывать строки как булевские параметры, и не преобразовывать в них. Это же ведь не очевидно (касаемо результата), и зачем лишний раз голову ломать. 

 
Alexey Volchanskiy:

Как преобразуется string в bool вот в таком коде? Я ожидал, будет хотя бы варнинг, однако проглотило без замечаний. Собственно, почему пишу, по ошибке вместо bool послал в функцию _Symbol и потом долго искал, где ошибка. 

Такой код нормален или нет?

PS: я в курсе, что false == 0, а true - любое значение, отличное от нуля. Но вот с такой интерпретацией строки... Кстати, пустая строка распознается, как false. Но ведь она же и пустая - объект?

void OnStart()
{
    string s = "qwerty";
    if(TestBool(s))
        Print("TestBool==true");
    else      
        Print("TestBool==false");

    if(s)
        Print("s==true");
    else      
        Print("s==false");
}

bool TestBool(bool b)
{
    return b;
}

***
 

лови

/*!
   Преобразование string значений в bool
   \param   string aValue - значение для преобразования в тип bool
   \return  преобразованное значение
*/

static bool CUtils::StringToBool(string aValue) {
   if(aValue != "true" && aValue != "false")
      printf(__FUNCTION__ + " переданное значение не соответствет типу bool в строковом виде");
   if(aValue == "true")
      return true;
//---
   return false;
}
 
Stanislav Aksenov:

Написал бы что принтит этот код, для наглядности

Я думаю что лучше не засовывать строки как булевские параметры, и не преобразовывать в них. Это же ведь не очевидно (касаемо результата), и зачем лишний раз голову ломать.

Принтит TestBool==true

Я же написал, что по-моему это ошибка, компилятор не должен пропускать передачу строки, как тип bool.

Короче, проверил в C++ на VS2015 

#include "stdafx.h"
#include <string>
#include <ostream>  
#include <iostream>

int main()
{
        std::string s = "qwerty";
        if (TestBool(s))
                std::cout << "TestBool==true";
        else
                std::cout << "TestBool==false";

        if (s)
                std::cout << "s==true";
        else
                std::cout << "s==false";

}

bool TestBool(bool b)
{
        return b;
}

Естественно, получил ошибку компиляции:

Severity        Code    Description     Project File    Line    Suppression State
Error (active)          no suitable conversion function from "std::string" to "bool" exists     ConsoleApplication1     c:\MyP\AvForex\trunk\AvRobot\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.cpp    12      
Error (active)          expression must have bool type (or be convertible to bool)      ConsoleApplication1     c:\MyP\AvForex\trunk\AvRobot\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.cpp    17      


*** Писать в сервисдеск?
 

 
coderex:

лови

/*!
   Преобразование string значений в bool
   \param   string aValue - значение для преобразования в тип bool
   \return  преобразованное значение
*/

static bool CUtils::StringToBool(string aValue) {
   if(aValue != "true" && aValue != "false")
      printf(__FUNCTION__ + " переданное значение не соответствет типу bool в строковом виде");
   if(aValue == "true")
      return true;
//---
   return false;
}
Зачем мне это? Я писал совсем о другом.
 
А чего так смущает, по-моему очевидно, что прикрутили что-то вроде bool string::operator bool() {return ! this.empty();}. Я был больше удивлён из-за такой ерунды (алерт срабатывает):
string s;
if(s != "")
   Alert(s);

Когда-то пытался возмущаться, но мне объяснили, что это, оказывается, нормально.
 
pavlick_:
А чего так смущает, по-моему очевидно, что прикрутили что-то вроде bool string::operator bool() {return ! this.empty();}.
Жаль, в MQL5 операторов приведения типа нет возможности задавать.
 
Alexey Volchanskiy:
Зачем мне это? Я писал совсем о другом.
Похоже, что просто посимвольное сложение, или что-то в этом роде. Только пустая строка даст ноль.
 
pavlick_:
А чего так смущает, по-моему очевидно, что прикрутили что-то вроде bool string::operator bool() {return ! this.empty();}. Я был больше удивлён из-за такой ерунды (алерт срабатывает):
string s;
if(s != "")
   Alert(s);

Когда-то пытался возмущаться, но мне объяснили, что это, оказывается, нормально.

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

COrderInfo oinfo;
if(TestBool(oinfo))
    Print("oinfo==true");
else      
    Print("oinfo==false");
---------------
'oinfo' - parameter conversion not allowed      TestIf.mq5      16      17


 ***

 
fxsaber:
Жаль, в MQL5 операторов приведения типа нет возможности задавать.
Есть 

dynamic_cast 

или вы о другом?
 
pavlick_:
А чего так смущает, по-моему очевидно, что прикрутили что-то вроде bool string::operator bool() {return ! this.empty();}. Я был больше удивлён из-за такой ерунды (алерт срабатывает):
string s;
if(s != "")
   Alert(s);

Когда-то пытался возмущаться, но мне объяснили, что это, оказывается, нормально.

Проверил, и правда выдает алерт! А вот так не выдает, очередной бред языка (((

Причина обращения: