Hay poco valor en agregar constcalificaciones a valores r que no son de referencia / no punteros, y no tiene sentido agregarlos a los valores integrados.
En el caso de los tipos definidos por el usuario , una constcalificación evitará que las personas que llaman invoquen una constfunción no miembro en el objeto devuelto. Por ejemplo, dado
const std::string foo();
std::string bar();
luego
foo().resize(42);
estaría prohibido, mientras
bar().resize(4711);
estaría permitido.
Para integradas como int, esto no tiene ningún sentido, porque tales valores r no se pueden modificar de todos modos.
(Sin embargo, recuerdo que Effective C ++ discutió cómo hacer el tipo de retorno de operator=()una constreferencia, y esto es algo a considerar).
Editar:
Parece que Scott dio ese consejo . Si es así, debido a las razones dadas anteriormente, lo encuentro cuestionable incluso para C ++ 98 y C ++ 03 . Para C ++ 11, lo considero claramente incorrecto , como parece haber descubierto el propio Scott. En las erratas para C ++ efectivo, 3ª ed. , escribe (o cita a otros que se quejaron):
El texto implica que todos los retornos por valor deben ser constantes, pero los casos en los que los retornos por valor no constantes tienen un buen diseño no son difíciles de encontrar, por ejemplo, tipos de retorno de std :: vector donde los llamadores usarán swap con un vector vacío para "tomar" el contenido del valor de retorno sin copiarlo.
Y después:
Declarar los valores de retorno de la función por valor const evitará que estén vinculados a referencias de rvalue en C ++ 0x. Debido a que las referencias de rvalue están diseñadas para ayudar a mejorar la eficiencia del código C ++, es importante tener en cuenta la interacción de los valores de retorno constantes y la inicialización de las referencias de rvalue al especificar firmas de funciones.