Cómo permitir la conversión de temporal a l-value para C ++ 98 API

Tengo C ++ 98 API que toma un valor por reference no const y cambia este valor.
Específicamente, estoy usando OpenCV y la function es cv::rectangle() que toma un cv::Mat & image para dibujar.

Esta misma API también utiliza templates de expresión para optimizar la aritmética de la image. Puedo dibujar un rectángulo en una Región de interés (ROI) creando un object contenedor temporal (no const) que represente una subimage.

Con VS2010, puedo escribir:

 cv::Mat a(10,10,CV_8UC1); // create 10x10 image Rect rec(0,0,2,2); // create 2x2 rectangle cv::rectangle(a, rec, cv::Scalar::all(0)); // (1) draw 2x2 on full image cv::rectangle(a(rec), rec, cv::Scalar::all(0)); // (2) draw 2x2 on 2x2 sub-image << !!! 

Esto funciona sin problemas. En la línea (2) se crea un object de contenedor de subimage temporal y se pasa a cv::rectangle por reference.

Sin embargo, en XCode para iOS con compatibilidad con Clang con C ++ 11 , la línea (2) da el siguiente error:

 .../test.cpp:605:5: No matching function for call to 'rectangle' .../core.hpp:2594:17: Candidate function not viable: expects an l-value for 1st argument 

Para completar, aquí está el prototipo relevante:

 //! draws the rectangle outline or a solid rectangle covering rec in the image CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0); 

Creo que esto sucede porque a(rec) crea un temporal que se pasa por reference a cv::rectangle y el comstackdor no permite que este temporal se convierta en un valor l. ¿Quizás esta temporal se define automáticamente como const?
De hecho, estoy pasando un temporal, pero el temporario es un contenedor para un valor real no constante y debería permitirse cambiar libremente.

¿Hay alguna manera de decirle a Clang que relaje estas restricciones?
¿De alguna manera es posible decirle al comstackdor que estos encabezados provienen de una biblioteca C ++ 98 y, por lo tanto, deberían manejar temporarios como en C ++ 98? ¿Algo parecido a hacer extern "C" ?
¿Hay alguna forma de permitir la conversión de lo temporal a un valor l?

Por supuesto, puedo escribir auto b=a(rec) y pasar b lugar, pero eso rellena el código con un montón de temporales nombrados y supera el propósito de las classs de envoltorio.

Respondiendo a mí mismo … después de algunas investigaciones más parece que este comportamiento está dictado por el estándar, y VS2010 no es conforme aquí.
Este comportamiento fue diseñado para evitar errores accidentales, aunque mi caso de uso es en realidad un ejemplo para un caso de uso válido que está prohibido por el estándar.

La regla: los temporales no const constan NO se unen a las references que no sean constantes.
La diferencia de los const temporales es que puede invocar los methods no const en el temporal.
Si dicho método devuelve, p *this Ej. *this , entonces ese resultado será un valor l y, por lo tanto, se unirá a la reference que no sea const.

Para más información ver aquí y aquí .

Como los comentarios de @Xeo anteriores, en C ++ 11 también es posible escribir un convertidor de un valor r a un valor l : template<class T> T& as_lvalue(T&& v){ return v; } // add 'hazard' icon template<class T> T& as_lvalue(T&& v){ return v; } // add 'hazard' icon .
Sin embargo, esto debe usarse con cuidado adicional (o no).