[Bo Persson]
The compiler has an __is_nothrow_assignable() built-in, which seems usable here.
Yeah, that's what VC's STL uses. Specifically: * Obviously library-only type traits are implemented with library code. * "Derived" type traits like is_nothrow_move_assignable are implemented in terms of "base" type traits like is_nothrow_assignable, as depicted by the Standard. * "Base" type traits are implemented by invoking compiler hooks directly. In previous versions, the STL sometimes compensated for compiler hooks behaving differently than the Standard Library's requirements, but over the years we've gotten compiler changes so we can just return whatever the hooks do. The only exceptions to this rule (that I can think of right now) are is_assignable (which probably *should* be powered by a hook like its trivial/nothrow cousins, but instead is written with Expression SFINAE by special dispensation) and aligned_storage/union (which cannot be powered by alignas yet; it uses library tech instead). The compiler hooks are undocumented, but because the STL uses them, Boost can use them too. Please report any bugs you encounter so both libraries can benefit. (The compiler team has been fixing several reported bugs in the hooks; 2015 RTM will report more accurate answers than ever before.) STL