#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
U>gcc не дает скомпилировать такой код U>http://ideone.com/nl3o7 U>в VS2010 код компилируется U>поковырял исходники, вроде VS пытается заюзать safe-bool idiom, однако все равно работает не как в гцц U>сделал свой классик, реализовал safe bool idiom через указатель на свою мембер-функцию — класс работает как надо: конвертация в bool не компилируется U>они опять что-то напортачили или я не понимаю что-то? где подкрутить, чтобы смарт-пойнтеры не конвертировались в bool и не выводились в std::cout ? U>спасибо
Теперь нужно разобраться подходит ли "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-initializationY y2 = z; // ill-formed: copy-initialization
Y y3 = (Y)z; // OK: cast notation
}
Очевидно VC не прав.
P.S.
Текст из драфта n3290 , могут быть расхождения с текстом в n3291.
Здравствуйте, _nn_, Вы писали:
__>Очевидно VC не прав.
мне больше интересно, почему он накосячил. ведь пытался сделать все правильно
помогите поковыряться в его коде
Re[3]: VS2010: unique_ptr implicitly convertible to bool
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, _nn_, Вы писали:
__>>Очевидно VC не прав. U>мне больше интересно, почему он накосячил. ведь пытался сделать все правильно U>помогите поковыряться в его коде
Боюсь все менее прозаично
struct Z
{
explicit operator bool() const { return true; }
};
int main()
{
}
error C2071: 'Z::operator bool' : illegal storage class
Здравствуйте, _nn_, Вы писали:
__>VC не поддерживает explicit operator cast.
это не относится к моему вопросу
мой вопрос в другом: почему работает implicit cast к bool для смарт пойнтеров. из кода это не ясно
Re[5]: VS2010: unique_ptr implicitly convertible to bool
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, _nn_, Вы писали:
__>>VC не поддерживает explicit operator cast. U>это не относится к моему вопросу U>мой вопрос в другом: почему работает implicit cast к bool для смарт пойнтеров. из кода это не ясно
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 pointerreturn (this->_Myptr != pointer() ? _CONVERTIBLE_TO_TRUE : 0);
}
}
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
Ясно.
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; // OKreturn 0;
}
Здравствуйте, 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
Здравствуйте, 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>они какую-то другую задачу решают таким образом?
Здравствуйте, 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