Index: src/ResolvExpr/ConversionCost.cpp
===================================================================
--- src/ResolvExpr/ConversionCost.cpp	(revision 2ae845e9845e67527392a47ddfba7b330ce783b8)
+++ src/ResolvExpr/ConversionCost.cpp	(revision 0dffe913f0656c8a089161fa8ddbc11348a81020)
@@ -250,4 +250,24 @@
 			newSrc = new ast::BasicType( ast::BasicKind::UnsignedInt );
 		}
+		if (dstAsRef->base->is_const() ) {
+			auto cvtCost = conversionCost(newSrc, dstAsRef->base, srcIsLvalue, symtab, env) ;
+			if (cvtCost == Cost::zero) { // exact match, may use a lvalue src
+				if ( srcIsLvalue ) {
+					if ( src->qualifiers == dstAsRef->base->qualifiers ) {
+						return Cost::reference;
+					} else if ( src->qualifiers < dstAsRef->base->qualifiers ) {
+						return Cost::safe;
+					} else {
+						return Cost::unsafe;
+					}
+				}
+				else {
+					return Cost::reference;
+				}
+			}
+			else { // not exact match, conversion is needed so lvalueness of src does not matter
+				return cvtCost + Cost::reference;
+			}
+		}
 		if ( typesCompatibleIgnoreQualifiers( newSrc, dstAsRef->base, env ) ) {
 			if ( srcIsLvalue ) {
@@ -259,7 +279,5 @@
 					return Cost::unsafe;
 				}
-			} else if ( dstAsRef->base->is_const() ) {
-				return Cost::safe;
-			} else {
+			} else { // rvalue-to-NC-ref conversion
 				return Cost::unsafe;
 			}
