Хобрук: Ваш путь к мастерству в программировании

Разница между (void)obj и void(obj)

Согласно http://en.cppreference.com/w/cpp/language/explicit_cast, приведение в стиле C и функциональное приведение эквивалентны. Однако см. следующий пример:

#include <array>
int main() {
  std::array<int, 3> arr{};
  (void)arr;
  //void(arr);
}

Пока (void)arr компилируется, void(arr) нет. Что я пропустил?

18.07.2014

  • Какое сообщение об ошибке вы получаете? 18.07.2014
  • void(arr) обязательно будет проанализировано как вызов функции. Как вы думаете, что вообще означает приведение к void? Потому что это ничего не значит! 18.07.2014
  • Приведение к void допустимо, и это означает, что результат выражения отбрасывается. Он часто используется для отключения предупреждений о неиспользуемых переменных, а также используется в TMP для предотвращения разрешения перегрузки при выборе перегруженных операторов запятой. 18.07.2014
  • Допустимые альтернативные синтаксисы для оператора выражения, приводящего к void, включают: ( void(arr) ); и static_cast<void>(arr);. 18.07.2014
  • @DavidHeffernan: Нет, это будет проанализировано как объявление переменной, что приведет к ошибкам, потому что переменная не может иметь тип void, а уже есть переменная с именем arr. 18.07.2014
  • @MikeSeymour Как компилятор определяет разницу между этим и вызовом функции? 18.07.2014
  • @DavidHeffernan: void не может быть именем функции, поэтому void(arr) не может быть вызовом функции. (Даже если бы это было возможно, наиболее раздражающий синтаксический анализ разрешит двусмысленность, интерпретируя ее как объявление, если это возможно). 18.07.2014
  • @MikeSeymour Итак, если бы у меня был тип с именем x и функция с именем x, то x(y); было бы объявлением? 18.07.2014
  • @DavidHeffernan: Нет, кажется, что эта конкретная двусмысленность дает ошибку, а не произвольно интерпретируется как объявление. Извините, что ввел вас в заблуждение. 18.07.2014
  • @DavidHeffernan: поиск имени определит, относится ли x в этом контексте к типу или функции, и остальная часть выражения будет оцениваться соответствующим образом. 18.07.2014

Ответы:


1

Если нет двусмысленностей (например, другие функции с тем же именем, макросы и т. д.), следующий код объявляет и определяет две переменные int

int a = 22;
int (b) = 33;

таким образом, вы пытаетесь создать тип переменной void (с существующим именем).

И это неправильно, потому что:

  1. Вы пытаетесь создать переменную void

  2. Вы пытаетесь использовать существующее имя для другой переменной в той же области

18.07.2014
  • Думаю, теперь я буду придерживаться синтаксиса (type)(var), чтобы избежать этой двусмысленности. Приведения в стиле C++ однозначны, но, с другой стороны, слишком неприятны. 18.07.2014

  • 2

    Хотя void(arr) обычно совпадает с (void)arr, в данном контексте это определение, и вы пытаетесь создать переменную с именем arr типа void, что недопустимо.

    18.07.2014
  • Так коротко, так правдоподобно, так на самом деле отвечая на вопрос. 18.07.2014
  • Новые материалы

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..

    AST для разработчиков JavaScript
    TL; DR Эта статья - мое выступление на недавно состоявшейся конференции Stockholm ReactJS Meetup. Вы можете посмотреть слайды здесь..

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..