Рассмотрим следующий код:
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
(экземпляр) не является типом. Поэтому в круглых скобках приведенное выше следует рассматривать как выражение, а не как предварительное объявление.