C ++ и постоянная ссылка на проблему временного связывания (Реализация языка D, передаваемого по значению и по ссылочным правилам в C ++ 0X) - PullRequest
4 голосов
/ 11 января 2011

Мне было интересно, в какой степени можно имитировать правила языка 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

Что ты думаешь? Любое предложение / комментарий / помощь приветствуется!

1 Ответ

3 голосов
/ 12 января 2011

Перегрузка на эталонном значении:

void f(X&&); // undefined
void f(const X& x) {...}
f( X() ); // error: f(X&&) undefined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...