Иногда нам хотелось бы взять большой параметр по ссылке, а также сделать ссылку константной, если это возможно, чтобы объявить, что это входной параметр.Но, сделав ссылку 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 весьма полезным.)