Looks like `operator bool` triggers something in the first example:
* `std::enable_if_t<true, B>` resolves to `B`
* A call through `B::operator bool` is necessary to convert `B` to `bool` for return from `method`
* That call happens through `std::enable_if_t` even if it just happens to be a typedef/using decl for `B`
I think in a smaller, related example this would make more sense:
```
// a.h
#include <string>
typedef std::string MyString;
// t.cc
#include "a.h"
int f() {
return MyString().size();
}
```
In the above, it makes sense that the mention of `MyString` and call to `size` refer to `a.h`.
The complication with `enable_if` is that it's supposed to be transparent, so referring to `<type_traits>` looks off. I think `remove_reference` is similar -- it's a typedef that doesn't really want to introduce a new name, just massage types.
Not sure how to detect that more generally...