Ошибка GCC: не удается преобразовать ‘const shared_ptr ‘ в ‘bool’ в ответ

#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 .