Задать вопрос
Kalombyr
@Kalombyr

Почему это компилируется и вообще как работает место в коде и что, так можно было (QSharedPointer)?

Добрый день!

Есть код:
.....
typedef QSharedPointer<QDataStream> AnswerData;
.....
Executor::AnswerData Executor::sendSync(int timeout)
{
    if ( !_serial->isConnected() ) return false;
    .......
}
.......
double Heating::getCurrentTemp()
{
    ......
    Executor::AnswerData data = _executer->sendSync();
    ......
    if (!data)  return -1;
    ......
}


Как видите, функция sendSync должна возвращать QSharedPointer, но в случае ошибки она возвращает false,
ну а в getCurrentTemp проверяется результат на false и выходит в случае чего.
И главное, это работает (вроде бы).

Я не нашёл в документации на QSharedPointer , почему так можно было сделать? А можно ли вообще (не будет ли каких-либо "сюрпризов")?

P.S. Компилятор MinGW, Qt 5.10.0
  • Вопрос задан
  • 280 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 3
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Вообще непонятно почему у вас так. Попробуйте чистый пример вроде:
QSharedPointer<QDataStream> doFoo()
{
    return false;
}

Возможно у вас что-то не то с флагами, или окружением, или компилятором, или версией Qt. Дело в том, что у QSharedPointer нет такого конструктора. Сделаю предположение, что у вас MSVC вместо компилятора :)

Советую возвращать какой-нибудь DefaultAnswer или просто nullptr.

Roman, те ссылки, что вы привели не релеванты. Они про приведение типа к bool, но не наоборот.
Ответ написан
Дополнение:
Опыты показали, что во всем виноват конструкторQSharedPointer(std::nullptr_t), как только к своему классу добавил аналогичный конструктор, стало возможно преобразование "return false" в объект класса.

nullptr_t ff2(0); //так можно
nullptr_t ff1(false); //так вроде нельзя, но MSVC не ругается


Старый и неверный ответ:
Ну так судя по документации QSharedPointer имеет соответствующие операторы преобразования, а именно
bool QSharedPointer::operator bool() const
bool QSharedPointer::operator!() const

Returns true if this object is not null. This function is suitable for use in if-constructs, like:
if (sharedptr) { ... }
Ответ написан
SerJook
@SerJook
кодер
Согласно стандарту C++11 такое не должно компилироваться. Но у Майкрософта своё видение стандартов.
GCC выдаст ошибку
error: could not convert ‘false’ from ‘bool’ to ‘QSharedPointer<QDataStream>'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы