unary_operator
unary_operator(source_location l, expression_ptr p) :
lhs.reset(new unary_operator<'+', unary_plus<valty>>(l, std::move(subexpr)));
lhs.reset(new unary_operator<'-', std::negate<valty>>(l, std::move(subexpr)));
lhs.reset(new unary_operator<'!', std::logical_not<valty>>(l, std::move(subexpr)));
lhs.reset(new unary_operator<'~', bit_not<valty>>(l, std::move(subexpr)));