Скобки вокруг результата значительны в заявлении о возврате?

Есть ли разница между этими двумя утверждениями внутри функции?

bool returnValue = true; //Code that does something return(returnValue); 

и это?

 bool returnValue = true; //Code return returnValue; 

Первый имеет круглые скобки вокруг returnValue .

В C ++ 14 добавлен случай, когда круглые скобки вокруг возвращаемого значения могут изменять семантику. Этот fragment кода показывает две объявляемые функции. Единственное различие – скобки вокруг возвращаемого значения.

 int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1)) 

В первом func1 возвращает int а во втором func1 возвращает int& . Разница в семантике напрямую связана с окружающими круглыми скобками .

auto спецификатор в его последней форме был введен в C ++ 11. В языке языка C ++ он описывается как:

Указывает, что тип объявляемой переменной будет автоматически выведен из его инициализатора. Для функций указывает, что возвращаемый тип является возвращаемым типом возврата или будет выведен из его операторов возврата (начиная с C ++ 14)

Кроме того, C ++ 11 представил спецификатор decltype который описан в спецификации языка C ++ :

Проверяет объявленный тип объекта или запрашивает возвращаемый тип выражения.

[Надрез]

  1. Если аргумент является либо нерасширенным именем объекта / функции, либо является выражением доступа к члену (member.member или pointer->), тогда decltype указывает объявленный тип объекта, указанного этим выражением.

  2. Если аргументом является любое другое выражение типа T, то

    a) если категория значений выражения равна xvalue, то в определении decltype указывается T &&

    b) если категория значений выражения равна lvalue, то в определении decltype указывается T &

    c) в противном случае decltype указывает T

[Надрез]

Обратите внимание: если имя объекта заключено в скобки, оно становится выражением lvalue, поэтому decltype (arg) и decltype ((arg)) часто являются разными типами.

В C ++ 14 была разрешена возможность использования decltype(auto) для типов возвращаемых функций. Исходные примеры – это то, где вступает в действие семантическая разница с круглыми скобками. Пересмотр исходных примеров:

 int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1)) 

decltype(auto) позволяет возвращать возвращаемый тип возвращаемой функции из выражения entity / expression в операторе return. В первой версии return var1; фактически совпадает с возвратом типа decltype(var1) (тип возврата int по правилу 1 выше), а во втором случае return (var1); он фактически совпадает с decltype((var1)) (тип int & return по правилу 2b).

Скобки создают тип возвращаемого значения int& вместо int , что приводит к изменению семантики. Мораль истории – «Не все круглые скобки по типу возврата создаются равными»

Да, один возвращает bool , в то время как другой boo


После редактирования:

нет, они одинаковы.

Нет никакой разницы.

Одной из причин использования скобок было бы, если бы вы хотели оценить выражение перед возвратом, но в вашем примере не было бы никакой причины. Видеть:

Скобки, окружающие возвращаемые значения

для дальнейшего обсуждения.

AFAIK, ничего не изменилось.

В C ++ выражения могут иметь форму: expr или (expr) . Таким образом, последнее является выражением с более типизированным. Для дальнейшего ознакомления с этим, обратитесь к грамматике (найдите «выражение»).

Скобки в верхнем примере являются излишними; они фактически игнорируются.

Это было бы так же, как что-то вроде …

 int x = (5); 

Здесь также игнорируются круглые скобки.

Нет, в вашем коде нет разницы.

Я предполагаю, что boo – опечатка, и вы спрашиваете, есть ли разница между

 return expr; 

а также

 return(expr); 

Ответ – нет.

Нет, между ними нет никакой разницы, хотя вы можете включить скобки, если это облегчает чтение и очистку выражения.

Вы оскорбительно тормозите компилятор!

Наличие скобок не только замедляет фазу предварительной обработки, но и генерирует более сложное абстрактное дерево синтаксиса: больше памяти, больше вычислений.


С семантической точки зрения? Они точно идентичны. Будут ли скобки или нет, оператор return будет полностью оценивать выражение перед его возвратом.

Они идентичны. Я вижу синтаксис скобок довольно часто, и я всегда спрашиваю тех, кто его использует: почему ? И никто не может ответить, почему они его используют.

Чтобы прямо подвести итог, скобки вокруг возвращаемых выражений используются людьми, которые не совсем понимают разницу между функционально подобными макросами и функциями или смущены в отношении приоритета или порядка оценки правил в C. Отсутствует кодирование стиль выгоды от использования круглых скобок.

таким образом

 return value; 

правильнее, чем

 return (value) 

потому что последнее предполагает, что вы не совсем знаете, что делаете 🙂

Нет разницы!!

Люди используют скобки, если есть сложное выражение.

BTW return – это утверждение, а не функция.

Оба одинаковы в вашем случае.

  • Как преобразовать List в List ?
  • GetMethod для общего метода
  • Неожиданный порядок оценки (ошибка компилятора?)
  • C # SIP Stack / Library
  • fork () в c с использованием printf
  • Жирный текст в MessageBox
  • Объединение streamов в C ++ 11
  • Есть ли существенная разница между использованием if / else и switch-case в C #?
  • Зачем писать 1000 000 000 как 1000 * 1000 * 1000 в C?
  • Невозможно создать постоянное значение - только примитивные типы
  • {" не ожидалось.} Deserializing Twitter XML
  • Давайте будем гением компьютера.