The precedence I was concerned about was not op== Thorsten, but unary op*.
Apologies, my example is probably not what I meant. Here's another try:
MACRO(lhs_ptr == rhs_ptr) expands to
OTHER_MACRO(Catch::ExpressionDecomposer()->*lhs_ptr == rhs_ptr, ...)
And since unary op* has higher precedence than op->*, I think that's equivalent to
OTHER_MACRO(Catch::ExpressionDecomposer()->(*lhs_ptr) == rhs_ptr, ...)
I.e. no longer Catch::ExpressionDecomposer::op->* and lhs, but Catch::ExpressionDecomposer::op-> and (*lhs). Thus compile error? Not tried, obviously...
Perhaps it doesn't matter if the only goal of ExpressionDecomposer is to know what operator is used by the expression, and it doesn't care about the type the template param of its op->* becomes, but in this case it looks to me that the 'star' will associate to lhs, not to ->. Again, I'm no C++ expert. I'm just concerned over such trickery "just" to have a single macro, in Catch and more importantly here to Boost.Test. --DD
The `->*` operator is one complete operator. In C++, the operators are decided during lexing before the preprocessor, and they don't change(with the exception of the `>>` operator in C++11). Futhermore, precedence decides the order of operators, not what the operators will become. Paul -- View this message in context: http://boost.2283326.n4.nabble.com/Boost-Test-Assertion-changes-in-trunk-WAS... Sent from the Boost - Dev mailing list archive at Nabble.com.