You must have declared a() as follows:
A a(std::fstream &out);
This function a() takes a reference to a mutable (non-const) std::fstream. But, your code:
A a(fstream(argv[1]));
constructs a temporary std::fstream as part of the expression that is the function call to a(). C++ will not permit a temporary object to be used as an argument to a function taking a non-const reference.
The rationale for this rule is that the non-const-ness of the reference implies that the function wants to change the referred to object. Any changes to a temporary constructed in this way are "lost" in the sense that they are discarded when the temporary object is destroyed, as the function call expression finishes. So, this case is often a logical error, and the rule aims to "fail safe" and disallow it.
In your second case, the fin variable isn't a temporary, so there the rule doesn't apply.