Your program is poorly formed in C ++ 11, since you created the std::vector type with an incomplete type as an argument. The type of the vector value must be completed when the type std::vector<T> .
As an incorrect program (and I do not know the requirements for diagnostics), any and all behavior is legal by standard.
The requirement that vector T is a full type is probably overridden (there is no compelling reason for this), but it does exist. Asking the same question in C ++ 1z, you will get a different answer, as this requirement has been relaxed.
Ignoring this problem philosophically:
Array a1 = { 1, 2 };
this should generate a std::vector with two elements.
foo(a1);
This should go a1 to foo , as the types match exactly.
foo(Array{ a1 });
Here we have {} . My rule of thumb with {} is "if it is not empty, and it can match the initializer_list constructor, it should be."
Since a1 can be converted to Value , Array{ a1 } is an array of one Value .
foo(Array({ a1 }));
Here we look at the argument of the Array constructor, which can be called using { a1 } . Both the constructor std::initalizer_list<Value> , and Array&& can be.
What is called does not matter: the Array&& constructor, in turn, sends {a1} to the std::initalizer_list<Value> constructor.
Therefore, I believe that it should print 211 . This, however, is just an opinion of what could be done, and not an analysis of what the standard says it should do, since the C ++ 11 standard clearly states that your program is poorly formed.
Hiding the copy constructor, on the other hand, seems rude.
In your last hand you wrote just a crazy type. Expect crazy behavior.
A more practical problem might be that the Value type has a template constructor that also matches std::vector<Value> .