To be more specific, you can use std::atomic<T> with any type T that is trivially copyable (no user-defined copy constructor, assignment etc.). Then, you can use the member function is_lock_free() to check if your atomic object is in fact lockfree.
I'd expect it to be lock-free for anything that's not larger than 8 bytes on a 64-bit Intel machine.
The only big caveat with std::atomic<T>::is_lock::free() is that you have to call it on an instance, you can't do it at compile time. The reason is that the C++ standard allows the "lock free" property of a std::atomic to vary from instance to instance of a given type T. It's a property of the object rather than the type.
In practice this won't really happen, at least not on Intel: data types that are small enough and trivially copyable will always be lockfree, other types won't.