Как я могу распечатать и вернуть в пределах одной строки? - PullRequest
2 голосов
/ 23 января 2020

Я знаю, что что-то подобное возможно, я просто забыл, как это сделать правильно.

if (true)
    printf("something"), return;

Ответы [ 2 ]

7 голосов
/ 23 января 2020

return не является выражением, поэтому он не может быть операндом оператора запятой.

Вот (тривиально) однострочная версия, которая работает:

if (true) { printf("something"); return; }

(Примечание: однострочный переоценен. Пишите для удобства чтения, а не для краткости, и если они совпадают, беспроигрышный вариант. Конечно, я сам должен чаще следовать моим советам ...)

РЕДАКТИРОВАТЬ: Вы может думать о некотором варианте

if (true) return (void) printf("something"); // for void functions
if (true) return printf("something"), 0;     // for an e.g. int function

, который работает, но уродлив и хакер, поскольку он затемняет то, что возвращается. Я не одобряю их использование.

1 голос
/ 23 января 2020

Если тип возврата std::list<int>, то вам нужно вернуть std::list<int>. Вы не можете просто ничего не возвращать, что и делает ваш код.

Быстрое исправление будет:

if (true)
{
    printf("something");
    return {};
}

Использование инициализация фигурной скобки это будет вернуть пустое std::list<int>. Тогда все, что вызывает эту функцию, должно будет проверять наличие пустого списка.


В C ++ 17 у нас есть std::optional, что позволяет нам возвращать необязательное значение: it может быть значением или отсутствовать.

Таким образом, вы можете изменить сигнатуру функции, чтобы она возвращала std::optional<std::list<int>> следующим образом:

std::optional<std::list<int>> getList()
{
    if (true)
        return {};

    ...
}

Здесь мы возвращаем nullopt_t для истинный случай. Затем код, вызывающий эту функцию, должен будет проверить возвращаемое значение:

auto l = getList();
if (l.has_value())                 //or simply if (l)
{
    //Do something with l.value()  //or simply *l
}

Ее небольшой пример: https://godbolt.org/z/SXbZSq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...