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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.