1

Тема: no viable conversion from returned value of type 'Object'

Вітаю, я тут намагаюся розібратися з операторами перетворення і чомусь отримую дивну помилку.
Є деяка сутність, яка вміє бути bool'ом

struct Object {
    explicit operator bool() const {
        return true;
    }
};

це добре працює, наприклад в if'і

if (object) std::cout << "TRUE\n";

але ось так

bool func() {
    return object;
}

компілятор свариться, що no viable conversion from returned value of type 'Object' to function return type 'bool'.
Щось я не розумію чому так?

Подякували: leofun011

2

Re: no viable conversion from returned value of type 'Object'

і що дивного?

3

Re: no viable conversion from returned value of type 'Object'

Дивно чому видається помилка, хоча я ж надав оператор перетворення в bool.

4 Востаннє редагувалося koala (11.10.2020 00:46:59)

Re: no viable conversion from returned value of type 'Object'

mimik написав:
explicit 

Гляньте значення цього слова якщо не в довіднику з C, то хоча б у словнику англійської.

Подякували: leofun011

5

Re: no viable conversion from returned value of type 'Object'

Добре, глянув. А чому тоді в операторі if все ок?

6

Re: no viable conversion from returned value of type 'Object'

А, ви про це? Це контекстуальне перетворення, розділ 4 п. 4 Стандарту. Ще те збочення. Ось тут є підбірка, де воно виконується:
https://stackoverflow.com/questions/399 … out-a-cast
Ніби така ідея, що в цих виразах неочевидні помилки перетворення неможливі, тому можна ігнорувати explicit. Якщо знайдете, як це можна експойтити для некоретного виконання - запостіть баг авторам стандарту, їм буде приємно.

Подякували: mimik, leofun012

7

Re: no viable conversion from returned value of type 'Object'

В С++11 на додаток до класичного поділу на "явне перетворення" і "неявне перетворення" ввели ще третє поняття "контекстно-явного перетворення". Використання значення в умовних контекстах на кшталт if (...), while (...) і т.п. тепер вважається контекстно-явним перетворенням до типу bool і в такій ситуації допускається виклик explicit перетворень до bool. А ось return з bool функції - не входить в цей список.

Подякували: mimik, leofun01, koala3

8

Re: no viable conversion from returned value of type 'Object'

Всім дякую, тепер зрозуміло чому воно не працювало.

9

Re: no viable conversion from returned value of type 'Object'

стандарт не передбачає перетворення літрів на кілометри, лише інтерпретацію, на кшталт "копати звідси і до вечора"