VS2010: unique_ptr implicitly convertible to bool
От: uzhas Ниоткуда  
Дата: 09.11.11 14:31
Оценка:
#include <memory>
int main()
{
  std::unique_ptr<int> a;
  bool x = a;
}


gcc не дает скомпилировать такой код
http://ideone.com/nl3o7
в VS2010 код компилируется
поковырял исходники, вроде VS пытается заюзать safe-bool idiom, однако все равно работает не как в гцц
сделал свой классик, реализовал safe bool idiom через указатель на свою мембер-функцию — класс работает как надо: конвертация в bool не компилируется
они опять что-то напортачили или я не понимаю что-то? где подкрутить, чтобы смарт-пойнтеры не конвертировались в bool и не выводились в std::cout ?
спасибо
Re: VS2010: unique_ptr implicitly convertible to bool
От: _nn_ www.nemerleweb.com
Дата: 09.11.11 14:52
Оценка:
Здравствуйте, uzhas, Вы писали:

U>
U>#include <memory>
U>int main()
U>{
U>  std::unique_ptr<int> a;
U>  bool x = a;
U>}
U>


U>gcc не дает скомпилировать такой код

U>http://ideone.com/nl3o7
U>в VS2010 код компилируется
U>поковырял исходники, вроде VS пытается заюзать safe-bool idiom, однако все равно работает не как в гцц
U>сделал свой классик, реализовал safe bool idiom через указатель на свою мембер-функцию — класс работает как надо: конвертация в bool не компилируется
U>они опять что-то напортачили или я не понимаю что-то? где подкрутить, чтобы смарт-пойнтеры не конвертировались в bool и не выводились в std::cout ?
U>спасибо

// 20.7.1.2.4, observers
typename add_lvalue_reference<T>::type operator*() const;
pointer operator->() const noexcept;
pointer get() const noexcept;
deleter_type& get_deleter() noexcept;
const deleter_type& get_deleter() const noexcept;
explicit operator bool() const noexcept;


Теперь нужно разобраться подходит ли "bool x = a" в explicit operator.

12.3.2 Conversion functions

2 A conversion function may be explicit (7.1.2), in which case it is only considered as a user-defined conversion
for direct-initialization (8.5). Otherwise, user-defined conversions are not restricted to use in assignments
and initializations. [ Example:

class Y { };

struct Z {
  explicit operator Y() const;
};

void h(Z z) {
  Y y1(z); // OK: direct-initialization
  Y y2 = z; // ill-formed: copy-initialization
  Y y3 = (Y)z; // OK: cast notation
}


Очевидно VC не прав.

P.S.
Текст из драфта n3290 , могут быть расхождения с текстом в n3291.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: VS2010: unique_ptr implicitly convertible to bool
От: uzhas Ниоткуда  
Дата: 09.11.11 14:55
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Очевидно VC не прав.

мне больше интересно, почему он накосячил. ведь пытался сделать все правильно
помогите поковыряться в его коде
Re[3]: VS2010: unique_ptr implicitly convertible to bool
От: _nn_ www.nemerleweb.com
Дата: 09.11.11 15:00
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, _nn_, Вы писали:


__>>Очевидно VC не прав.

U>мне больше интересно, почему он накосячил. ведь пытался сделать все правильно
U>помогите поковыряться в его коде

Боюсь все менее прозаично
struct Z
{
  explicit operator bool() const { return true; }
};

int main()
{
}


error C2071: 'Z::operator bool' : illegal storage class


http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx
VC не поддерживает explicit operator cast.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: VS2010: unique_ptr implicitly convertible to bool
От: uzhas Ниоткуда  
Дата: 09.11.11 15:36
Оценка:
Здравствуйте, _nn_, Вы писали:

__>VC не поддерживает explicit operator cast.

это не относится к моему вопросу
мой вопрос в другом: почему работает implicit cast к bool для смарт пойнтеров. из кода это не ясно
Re[5]: VS2010: unique_ptr implicitly convertible to bool
От: _nn_ www.nemerleweb.com
Дата: 09.11.11 16:27
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, _nn_, Вы писали:


__>>VC не поддерживает explicit operator cast.

U>это не относится к моему вопросу
U>мой вопрос в другом: почему работает implicit cast к bool для смарт пойнтеров. из кода это не ясно

http://msdn.microsoft.com/en-us/library/ee475599.aspx


operator bool
The operator returns a value of a type that is convertible to bool. The result of the conversion to bool is true when get() != pointer(), otherwise false.

memory:
unique_ptr
{
  ...
  
   _OPERATOR_BOOL() const
        {    // test for non-null pointer
        return (this->_Myptr != pointer() ? _CONVERTIBLE_TO_TRUE : 0);
        }  
}


Это интересовало ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: VS2010: unique_ptr implicitly convertible to bool
От: uzhas Ниоткуда  
Дата: 09.11.11 17:47
Оценка:
Здравствуйте, _nn_, Вы писали:

__>memory:

__>
__>unique_ptr
__>{
__>  ...
  
__>   _OPERATOR_BOOL() const
__>        {    // test for non-null pointer
__>        return (this->_Myptr != pointer() ? _CONVERTIBLE_TO_TRUE : 0);
__>        }  
__>}
__>


__>Это интересовало ?

интересует то, что _OPERATOR_BOOL() это не просто operator bool, а приседания на тему safe bool idiom
Re: VS2010: unique_ptr implicitly convertible to bool
От: Masterkent  
Дата: 10.11.11 06:21
Оценка: 6 (1)
uzhas:

U>поковырял исходники, вроде VS пытается заюзать safe-bool idiom, однако все равно работает не как в гцц


Safe bool idiom допускает неявное преобразование в bool. Цепочка преобразований source -> pointer to member -> bool вполне может составлять implicit conversion sequence.

U>сделал свой классик, реализовал safe bool idiom через указатель на свою мембер-функцию — класс работает как надо


Сомнительно.
Re[7]: VS2010: unique_ptr implicitly convertible to bool
От: _nn_ www.nemerleweb.com
Дата: 10.11.11 07:00
Оценка: 6 (1)
Здравствуйте, uzhas, Вы писали:

Ясно.
Masterkent уже об этом написал.
Safe-bool idiom != explicit operator bool.

Вариант 1.
class My
{
    typedef int My::*SafeBoolType;
    int f;

public:
    operator SafeBoolType() { return &My::f; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    My a;
    bool c = a; // OK
    return 0;
}


Вариант 2
class My2
{
    typedef void (My2::*SafeBoolType)();
    void F() {}

public:
    operator SafeBoolType() { return &My2::F; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    My2 a;
    bool c = a; // OK
    return 0;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: VS2010: unique_ptr implicitly convertible to bool
От: uzhas Ниоткуда  
Дата: 10.11.11 07:26
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>Сомнительно.

мда, во всем виноват недостаток юнит тестов!
благодарю за исчерпывающий ответ
Re[2]: VS2010: unique_ptr implicitly convertible to bool
От: uzhas Ниоткуда  
Дата: 10.11.11 08:35
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>Safe bool idiom допускает неявное преобразование в bool. Цепочка преобразований source -> pointer to member -> bool вполне может составлять implicit conversion sequence.

кстати, а какой тогда смысл у VS2010 приседать с safe bool idiom, если она не работает?
могли бы просто сделать operator bool()
они какую-то другую задачу решают таким образом?
Re[3]: VS2010: unique_ptr implicitly convertible to bool
От: _nn_ www.nemerleweb.com
Дата: 10.11.11 10:08
Оценка: 6 (1)
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Masterkent, Вы писали:


M>>Safe bool idiom допускает неявное преобразование в bool. Цепочка преобразований source -> pointer to member -> bool вполне может составлять implicit conversion sequence.

U>кстати, а какой тогда смысл у VS2010 приседать с safe bool idiom, если она не работает?
U>могли бы просто сделать operator bool()
U>они какую-то другую задачу решают таким образом?

Ну как же.
Банальный
myPtr << 1;


Тут все разъясняется:
http://www.artima.com/cppsource/safebool.html
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: VS2010: unique_ptr implicitly convertible to bool
От: cppnick  
Дата: 10.11.11 10:10
Оценка: 6 (1)
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Masterkent, Вы писали:


M>>Safe bool idiom допускает неявное преобразование в bool. Цепочка преобразований source -> pointer to member -> bool вполне может составлять implicit conversion sequence.

U>кстати, а какой тогда смысл у VS2010 приседать с safe bool idiom, если она не работает?
U>могли бы просто сделать operator bool()
U>они какую-то другую задачу решают таким образом?

От тут расписано, для чего safe bool и какие проблемы оно решает.
Re[4]: VS2010: unique_ptr implicitly convertible to bool
От: uzhas Ниоткуда  
Дата: 10.11.11 11:23
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Тут все разъясняется:

мда, я пытался решить свою проблему не тем средством =\
ну да ладно, переживем =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.