In reference to the ": int" specifying the underlying type, if I saw that, I'd have a look around and see if they delcare all their enums that way. If so, they probably just learnt to write enums that way ( or maybe they are a hyper-explicit coder). If however, just this enum was declared this way, perhaps the programmer is trying to say something (that might have been better said with a comment) that it is critical that this has an underlying "int" type. Perhaps it is being binary serialised or deserialised somewhere.
As for the [Flags] attribute, as far as C# is concerned, you can use bitwise operators on any enum, not just those declared with [Flags]. From your above example, without any [Flags], the following is totally legal:
abc myAbcValue = value1 | value2;
The primary difference with respect to the [Flags] is in the ToString() and Parse() methods of Enum. Without [Flags], myAbvValue.ToString() will return "3", but with [Flags] it will return "value1, value2". Likewise, with the [Flags],
abc yourAbcValue = (abc)Enum.Parse( typeof(abc), "value1, value2") ;
will set the underlying value of yourAbcValue to 3.
Note that the IsDefined() method of Enum() does not allow for multiple values with [Flags] enums, so:
Enum.IsDefined( typeof(abc), "value1, value2")
returns false regardless of the use of [Flags].
Also note that [Flags] provides information for any reflection access, and other languages may treat the restriction on flagged enums differntly to normal enums.