#c #gcc #c 11
#c #gcc #c 11
Вопрос:
Я переключаюсь на GCC 4.6.1, и он начинает жаловаться на код, который отлично работает с GCC 4.4 и MSVC10. Похоже, что он не хочет конвертировать между shared_ptr
и bool
при возврате из функции, подобной этой:
class Class { shared_ptr<Somewhere> pointer_; };
bool Class::Function () const
{
return pointer_;
}
используя
return static_cast<bool> (pointer_);
все работает. Что, черт возьми, происходит? Это с --std=cpp0x
помощью .
Комментарии:
1. Какого черта вы хотите это сделать?
2. Чтобы проверить, установлен ли указатель.
Ответ №1:
В C 11 shared_ptr
имеет значение an explicit
operator bool
, что означает, что a shared_ptr
не может быть неявно преобразован в a bool
.
Это делается для предотвращения некоторых потенциальных ошибок, когда a shared_ptr
может быть случайно преобразовано в арифметических выражениях и подобных ситуациях.
Добавление явного приведения является допустимым исправлением вашего кода.
Вы также могли бы сделать return pointer_.get() != 0;
return pointer_.get();
или даже return pointer_ != nullptr;
.
Комментарии:
1. @LucDanton: Без всякой разумной причины мне совершенно не нравится этот метод, но да, он тоже работает.
2. Честно говоря, я упомянул об этом, потому что он предшествовал явным операторам преобразования и контекстным преобразованиям.
3. @LucDanton Если вам нравится запутывание, да. То, что вы действительно хотели бы написать, это или
return pointer != NULL;
илиreturn pointer.is_valid();
или что-то подобное. К сожалению, ни Boost, ни комитет по стандартам не решили поддержать это, поэтому вы застрялиreturn pointer.get() != NULL'
.4. Извините за длинный удар. Почему бы не вернуть pointer_.is_initialized() ?
Ответ №2:
shared_ptr имеет явное преобразование bool. Он может использоваться в условном выражении или может быть явно преобразован в bool, как вы сделали со static_cast .