Lately I ran into a problem which somehow (but only somehow) makes sense to me. It is based on interpreting the construction of a temporary as declaration of the single (!)
1) Foo0(x) is treated as a parameter of function bar0 in this instance. Here, it does not matter if it has a standard constructor or not. It's not a local variable declaration and initialization, but just a parameter declaration in a function declaration.
2) My guess is this has something to do with the parsing, but somebody correct me if I'm wrong.. Examples bar1 and bar2 work, because the compiler knows that bar1 and bar2 are local variable declarations (and not function declarations) as soon as it sees the first occurrence of {}. These first occurences of {} appear before x is declared twice as a parameter of the function.
3) The construction of bar3 fails, because the compiler first assumes that bar3 is a function declaration. The function declaration takes three parameters, which are all named x. Obviously, this is not correct.
4) The x in the function declaration is just a name for the parameter. It is in a different scope than the integer x you declared before that.