Initial `bindings/reference/known_operations.md`.
PiperOrigin-RevId: 537073062
diff --git a/docs/bindings/reference/operator_overloading.md b/docs/bindings/reference/operator_overloading.md
new file mode 100644
index 0000000..b6bdda1
--- /dev/null
+++ b/docs/bindings/reference/operator_overloading.md
@@ -0,0 +1,74 @@
+# Bindings for operators and special member functions
+
+Here we describe how Crubit bindings work with C++ special member functions and
+operator overloading (e.g. the copy constructor, or `operator==`) and with
+traits from the Rust standard library (e.g. the `Clone` or `PartialEq` traits).
+
+Rust traits which return `Self` by value (or use mutable references) are only
+implemented in the bindings for a given C++ type if that type is
+[is `Unpin`](../../unpin.md).
+
+## Bidirectional map
+
+The following special member functions and traits are mapped bidirectionally:
+
+C++ | Rust | Notes
+------------------- | --------- | -------------------------
+Default constructor | `Default` | C++ types must be `Unpin`
+
+## One-way map of C++ special member functions into Rust traits
+
+If the C++ type [is `Unpin`](../../unpin.md), then the C++ special member
+functions below are mapped one-way into the corresponding Rust traits as
+follows:
+
+| C++ API | Rust bindings | Notes |
+| ------------------------- | ------------- | -------------------------------- |
+| Trivial copy constructor | `Copy` | Also requires that the C++ type |
+: : : is non-abstract and has a :
+: : : public, trivial copy constructor :
+: : : and destructor. :
+: : : <br>TODO(b/258249993)\: Provide :
+: : : bidirectional map. :
+| Custom copy constructor | `Clone` | TODO(b/259741191): Provide |
+: : : bidirectional map. :
+| Destructor | `Drop` | TODO(b/258251148): Provide |
+: : : bidirectional map. :
+| Constructor taking single | `From<T>` | Regardless if the constructor is |
+: parameter of type `T` : : `explicit` in the C++ API or not :
+
+The C++ binary operators below are mapped one-way into the corresponding Rust
+traits as follows:
+
+C++ API | Rust bindings
+------------- | --------------
+`operator==` | `PartialEq`
+`operator<` | `PartialOrd`
+`operator+` | `Add`
+`operator-` | `Sub`
+`operator*` | `Mul`
+`operator/` | `Div`
+`operator%` | `Rem`
+`operator&` | `BitAnd`
+`operator\|` | `BitOr`
+`operator^` | `BitXor`
+`operator<<` | `Shl`
+`operator>>` | `Shr`
+`operator+=` | `AddAssign`
+`operator-=` | `SubAssign`
+`operator*=` | `MulAssign`
+`operator/=` | `DivAssign`
+`operator%=` | `RemAssign`
+`operator&=` | `BitAndAssign`
+`operator\|=` | `BitOrAssign`
+`operator^=` | `BitXorAssign`
+`operator<<=` | `ShlAssign`
+`operator>>=` | `ShrAssign`
+
+The C++ unary operators below are mapped one-way into the corresponding Rust
+traits as follows:
+
+C++ API | Rust bindings
+----------- | -------------
+`operator-` | `Neg`
+`operator!` | `Not`