Можно ли взять параметр по константной ссылке, при этом запретив преобразования, чтобы вместо этого не передавались временные значения?

Иногда нам нравится брать большой параметр по ссылке, а также, если возможно, сделать ссылку константой, чтобы объявить, что это входной параметр. Но, сделав ссылку const, компилятор затем позволяет себе преобразовывать данные, если они имеют неправильный тип. Это означает, что это не так эффективно, но больше волнует тот факт, что я думаю, что я имею в виду исходные данные; возможно, я возьму его адрес, не понимая, что я, по сути, беру адрес временный.

Призыв кbar в этом коде не получается. Это желательно, потому что ссылка имеет неправильный тип. Призыв кbar_const также имеет неправильный тип, но он автоматически компилируется. Это нежелательно для меня.

#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);
}

Какой самый безопасный способ передать легкую ссылку только для чтения? Я испытываю желание создать новый шаблон, похожий на ссылку.

(Очевидно,int а такжеlong очень маленькие типы. Но меня поймали большие структуры, которые можно преобразовать друг в друга. Я не хочу, чтобы это произошло тихо, когда я использую константную ссылку. Иногда пометка конструкторов как явных помогает, но это не идеально)

Обновить: Я представляю себе систему, подобную следующей: представьте, что у вас есть две функцииX byVal(); а такжеX& byRef(); и следующий блок кода:

 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

Этот пример основан на локальных переменных, но я хочу, чтобы он также работал с параметрами. Я хочу получить какое-то сообщение об ошибке, если я случайно передаю ref-to-временный или ref-to-a-copy, когда мне кажется, что я передаю что-то более легкое, например, ref-to-lvalue. Это просто «стандарт кодирования» - если я на самом деле хочу разрешить передачу ссылки на временный объект, то я буду использовать простуюconst X&, (Я нахожуэтот кусок на FOREACH Boost быть весьма полезным.)

Ответы на вопрос(6)

Ваш ответ на вопрос