std::string(false)
От: Шебеко Евгений  
Дата: 28.08.07 16:11
Оценка: 6 (1) :)
std::string CWatchEvents::OnLevelIcon(const AplMod::CPropListCtrl::row_ctx_t& _ctx)
{
...
    if(!watcher->is_unaccepted(*ctx.evt))return false;
...
}


Так привык к жёсткой типизации, что казалось бы подобная конструкция не должна компилироваться, но хотя бы
варнингом ругнуться.

Компилируется на ура VC7.1

Вызывается:
basic_string(const _Elem *_Ptr)


Будьте осторожны!
Re: std::string(false)
От: Пётр Седов Россия  
Дата: 28.08.07 17:30
Оценка: :))
Здравствуйте, Шебеко Евгений.
Возможно, неявное преобразование «false -> std::string» означает, что std::string — ложная (false) ценность . Неявное преобразование «true -> std::string» отсутствует .
Пётр Седов (ушёл с RSDN)
Re[2]: std::string(false)
От: Аноним  
Дата: 28.08.07 18:07
Оценка: :)
ПС>Здравствуйте, Шебеко Евгений.
ПС>Возможно, неявное преобразование «false -> std::string» означает, что std::string — ложная (false) ценность . Неявное преобразование «true -> std::string» отсутствует .
false это синоним 0 из соображеинй совместимости с С
Re: std::string(false)
От: drx США  
Дата: 28.08.07 18:15
Оценка: 29 (2)
Здравствуйте, Шебеко Евгений, Вы писали:


ШЕ>Так привык к жёсткой типизации, что казалось бы подобная конструкция не должна компилироваться, но хотя бы

ШЕ>варнингом ругнуться.
ШЕ>Компилируется на ура VC7.1
ШЕ>Будьте осторожны!

К сожалению, это законно. Стандарт описывает null pointer constant следующим образом [conv.ptr]:

A null pointer constant is an integral constant expression rvalue of integer type that evaluates to
zero.

Жаль, что нет ворнинга.
Re[3]: std::string(false)
От: Roman Odaisky Украина  
Дата: 28.08.07 19:24
Оценка: 1 (1) +2
Здравствуйте, Аноним, Вы писали:

ПС>>Возможно, неявное преобразование «false -> std::string» означает, что std::string — ложная (false) ценность :). Неявное преобразование «true -> std::string» отсутствует :).

А>false это синоним 0 из соображеинй совместимости с С

#include <sys/senses/humour.h>
До последнего не верил в пирамиду Лебедева.
Re[4]: std::string(false)
От: Аноним  
Дата: 29.08.07 11:34
Оценка: 1 (1)
RO>#include <sys/senses/humour.h>
Над своим знанием стандарта смеетесь?
http://www.kuzbass.ru/docs/isocpp/conv.html#conv.prom
Re[2]: std::string(false)
От: Bell Россия  
Дата: 29.08.07 12:20
Оценка: +1
Здравствуйте, drx, Вы писали:

drx>Жаль, что нет ворнинга.

Остается только с нетерпением ждать нового стандарта с nullptr
Любите книгу — источник знаний (с) М.Горький
Re: std::string(false)
От: remark Россия http://www.1024cores.net/
Дата: 29.08.07 16:18
Оценка: 1 (1)
Здравствуйте, Шебеко Евгений, Вы писали:

ШЕ>
ШЕ>std::string CWatchEvents::OnLevelIcon(const AplMod::CPropListCtrl::row_ctx_t& _ctx)
ШЕ>{
ШЕ>...
ШЕ>    if(!watcher->is_unaccepted(*ctx.evt))return false;
ШЕ>...
ШЕ>}
ШЕ>


ШЕ>Так привык к жёсткой типизации, что казалось бы подобная конструкция не должна компилироваться, но хотя бы

ШЕ>варнингом ругнуться.

ШЕ>Компилируется на ура VC7.1


ШЕ>Вызывается:

ШЕ>
ШЕ>basic_string(const _Elem *_Ptr)
ШЕ>


ШЕ>Будьте осторожны!



Сделали б так:

class string
{
public:
    string(char const* str)
    {
    }
private:
    string(bool);
    string(int);
};



Тогда:

string f()
{
    char const* str = "asd";
    switch (0)
    {
    case 0: return string(str);
    case 1: return string("asd");
    case 2: return str;
    case 3: return false; // Нафиг
    case 4: return 0; // Нафиг
    }
}



А ещё лучше так:

class string
{
public:
    template<size_t size>
    string(char const (&literal) [size])
    {
    }

    explicit string(char const* str)
    {
    }
private:
    string(bool);
    string(int);
};


Литералы — пожалуйста. А если фигня всякая остальная, то нафиг.


string f()
{
    char const* str = "asd";
    switch (0)
    {
    case 0: return string(str);
    case 1: return string("asd");
    case 2: return str; // Тоже Нафиг
    case 3: return false; // Нафиг
    case 4: return 0; // Нафиг
    }
}



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: std::string(false)
От: alexeiz  
Дата: 30.08.07 04:38
Оценка: 3 (1)
Здравствуйте, remark, Вы писали:

R>Сделали б так:


R>
R>class string
R>{
R>public:
R>    string(char const* str)
R>    {
R>    }
R>private:
R>    string(bool);
R>    string(int);
R>};
R>


Отличная идея. string(NULL), который здесь запрещается, все равно не имеет смысла. А всякие левые преобразования отметаются. Жалко, что на defect report не потянет. Был уже один такой
Re[3]: std::string(false)
От: remark Россия http://www.1024cores.net/
Дата: 30.08.07 08:44
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Отличная идея. string(NULL), который здесь запрещается, все равно не имеет смысла. А всякие левые преобразования отметаются. Жалко, что на defect report не потянет. Был уже один такой



Ну по крайней мере можно взять на вооружение, когда будешь делать это
Автор: AndrewJD
Дата: 29.08.07

Ну о вообще для всяких других классов.

Можно ещё написать в M$ или на мэйлинг g++. Может действительно включат в библиотеку.
Насколько я понимаю это отметает только программы с UB, т.ч. если они не будут компилироваться это только к лучшему.
Вообще было бы замечательно, если бы компилятор ловил все UB на стадии компиляции


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.