Иногда нам нравится брать большой параметр по ссылке, а также сделать ссылку const, если возможно, объявить, что это входной параметр. Но, создав ссылку 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
- очень маленькие типы, но я был пойман с более крупными структурами, которые могут быть преобразованы друг в друга. Я не хочу, чтобы это молчаливо случалось, когда я принимаю const, иногда отмечая конструкторы как явные, но это не идеально)
Обновление: Я предполагаю, что система похожа на следующую: представьте, что у вас есть две функции 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-tempor или ref-to-copy, когда думаю, что я передам что-то легкое, например ref-to-lvalue. Это всего лишь "стандарт кодирования" - если я действительно хочу разрешить передачу ссылки на временную, я буду использовать простой const X&
. (Я нахожу этот фрагмент на Boost FOREACH, чтобы быть весьма полезным.)