Мне было интересно, в какой степени можно имитировать правила языка D для передачи по значению и передачи по ссылочным правилам в C ++. Для справки, пожалуйста, смотрите следующие две ссылки (в основном Александреску):
http://bartoszmilewski.wordpress.com/category/d-programming-language/page/2/
и
http://groups.google.com/group/comp.std.c++/msg/303e3bf2407a7609?
Одним из ключевых отличий является то, что в D const ссылки не привязываются (как неконстантные) к временным файлам.
Однако я не знаю ни одного способа определения универсального класса X таким образом, чтобы следующий код не скомпилировался:
void f(const X& x) {...}
f( X() ); //Cannot disable binding of const ref to X
Одной из возможностей может быть создание функции шаблона, проверка rvalue / lvalue-ness переданного аргумента (возможно в C ++ 0X) и использование disable_if, но это слишком загромождает код и плохо масштабируется.
Другой возможностью может быть введение шаблона класса, подобного
template<class T> Ref<T> : public T {...} //D-style ref, does not bind to temporaries!
и затем используйте
void f(Ref<const X> x) {...} //Does not look bad....
f( X() ); //Compile error here is doable, I checked a similar example already...
Однако, таким образом, я теряю возможность писать функции шаблонов, принимая Ref, так как следующее не будет компилироваться ...
template<class T> void ft(Ref<const T> x) {...}
ft( X() ); //Template deduction error
Что ты думаешь? Любое предложение / комментарий / помощь приветствуется!