The copy constructor should always be declared as X (const X&). There will never be any reason why either the compiler or programmer would ever need a copy constructor that takes a non-const reference ...