Source: https://www.ipb.uni-bonn.de/html/teaching/modern-cpp/slides/lecture_6.pdf