Что должны делать скобки в "самом неприятном разборе"?

Мы все знаем, что это самый неприятный анализ:

Foo f( Bar() );

Каждый компилятор считает, что это объявление функции. Но я никогда не видел, чтобы кто-нибудь использовал скобки в таком объявлении функции. Что означают эти скобки? Предположим, это было объявление функции - есть ли различия между

Foo func( Bar() ); //do we need the parenthesis after Bar?
Foo func( Bar );
Foo func( Bar b );

"Bar()" эквивалентен "Bar" там? Или есть другое поведение, которое означает добавление скобок? Если нет, то почему C++ допускает скобки в объявлении функции подобным образом? Похоже, это должно быть ошибкой в ​​деле замедления функций, не так ли?

1 ответ

Есть ли "Bar()" [эквивалент] "Bar"?

Нет.

Или есть другое поведение, которое означает добавление скобок?

Как и в любом выражении, обычное ожидание состоит в том, что это создает временный тип Bar, Программист надеется передать это временное значение в качестве аргумента.

Если нет, то почему C++ допускает скобки в объявлении функции подобным образом? Похоже, что это должно быть ошибкой в ​​функции [объявление], нет?

У C++ на самом деле нет никаких причин запрещать это. Достаточно плохо, что вышеописанное ожидание не всегда на самом деле оправдывается (из-за самого неприятного анализа); Запрет на использование временных значений в качестве аргументов функций будет еще хуже.

Вот типичный и идиоматический пример передачи временного аргумента функции:

// Read all input from cin one word at a time, storing
// the words in col.
std::vector<std::string> col;
std::copy(
   std::istream_iterator<string>(cin),
   std::istream_iterator<string>(),
   std::back_inserter(col)
);

На самом деле, все эти аргументы являются временными. Однако есть только один, который (как ваш пример) сам по себе не принимает никаких аргументов.

Теперь, если вы спрашиваете, почему C++ мог полностью избежать самого неприятного анализа, запретив другое значение этих скобок, тогда, ну, это могло бы быть сделано. Но... только путем существенного изменения структуры грамматики для объявлений функций, которые могли бы сломать существующий код, полагаясь на устаревшие C-измы. Лучше нет, а?

То, что круглые скобки могут означать то, что позволяет им показывать самый неприятный синтаксический анализ, объясняется просто тем, как устроена грамматика, и желанием не иметь "особых случаев", заражающих ее повсюду!

Другие вопросы по тегам