É possível usar um parâmetro por referência const, banindo conversões para que os temporários não sejam transmitido

s vezes, gostamos de usar um parâmetro grande por referência e também de tornar a referência const, se possível, para anunciar que é um parâmetro de entrada. Mas, ao fazer a referência const, o compilador se permite converter dados se forem do tipo errado. Isso significa que não é tão eficiente, mas mais preocupante é o fato de eu estar me referindo aos dados originais; talvez eu tome o endereço dele, sem perceber que, de fato, estou usando o endereço de um temporári

A chamada parabar neste código falha. Isso é desejável, porque a referência não é do tipo correto. A chamada parabar_const também é do tipo errado, mas é compilado silenciosamente. Isso é indesejável para mim.

#include<vector>
using namespace std;

int vi;

void foo(int &) { }
void bar(long &) { }
void bar_const(const long &) { }

int main() {
   foo(vi);
   // bar(vi); // compiler error, as expected/desired
   bar_const(vi);
}

Qual é a maneira mais segura de passar uma referência leve e somente leitura? Estou tentado a criar um novo modelo semelhante a referência.

(Obviamente,int elong são tipos muito pequenos. Mas fui pego com estruturas maiores que podem ser convertidas umas nas outras. Eu não quero que isso aconteça silenciosamente quando estou usando uma referência const. Às vezes, marcar os construtores como ajuda explícita, mas isso não é o ideal)

Atualizar Imagino um sistema como o seguinte: Imagine ter duas funçõesX byVal(); eX& byRef(); e o seguinte bloco de código:

 X x;
 const_lvalue_ref<X> a = x; // I want this to compile
 const_lvalue_ref<X> b = byVal(); // I want this to fail at compile time
 const_lvalue_ref<X> c = byRef(); // I want this to compile

Esse exemplo é baseado em variáveis locais, mas quero que ele também funcione com parâmetros. Quero receber algum tipo de mensagem de erro se estiver passando acidentalmente uma ref-para-temporária ou uma ref-para-uma cópia quando acho que vou passar algo leve, como um ref-para-valor. Isso é apenas uma coisa 'padrão de codificação' - se realmente quero permitir a passagem de um árbitro para um temporário, usarei um @ simplconst X&. (Estou encontrando esta peça no FOREACH da Boost para ser bastante útil.)

questionAnswers(12)

yourAnswerToTheQuestion