Заключение в скобки неназванных временных символов в C ++ - PullRequest
4 голосов
/ 11 февраля 2012

Рассмотрим следующий код:

struct Foo
{
};

struct Bar
{
  explicit Bar(const Foo&)
  {
  }
};

int main()
{
  Foo foo;

  Bar bar(foo); // Okay.
  Bar(foo);     // Will not compile.
  (Bar(foo));   // Okay. Unnamed temporary requires parenthesis.
}

Зачем нужны круглые скобки вокруг временной версии? Какую двусмысленность они решают?

Моя догадка такова: я думаю, что компилятор видит Bar(foo) как объявление для функции, но я не уверен, почему это так, поскольку foo (экземпляр) не является типом. Поэтому в круглых скобках приведенное выше следует рассматривать как выражение, а не как предварительное объявление.

1 Ответ

5 голосов
/ 11 февраля 2012

Поздравляем с открытием самого неприятного анализа .

Скотт Мейерс описывает это следующим образом:

В общем случае язык [C ++] (благодаря, к сожалению, его истории) будет пытаться интерпретировать любое объявление, сделанное таким образом, как объявление функции.

В вашем случае введение круглых скобок устраняет неоднозначность, заставляя его стать локальным.

...