Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вот вам очевидно, что когда на тело не действует сила, то оно движется равномерно или находится в покое. Потому что вам известен курс элементарной физики и вы решили много задач по теме. А вот Аристотелю — нет.
int main()
{
int $ = 5;
}
Если память не изменяет, даже видел, как доллар использовали как имя макроса в какой-то C библиотеке.ну а двойной амперсант по аналогии с указателем на указательНу это не совсем корректная аналогия, это же не ссылка на ссылку. И потом, три звездочки можно, а три амперсанда уже нет.
lvalue определить сравнительно просто: это все что может стоять слева от знака присвоения '='.Определение так себе, во-первых, это верно лишь для встроенного оператор присваивания, но не для перегруженного:
int f();
f() = 0; // Ошибка, в rvalue нельзя присвоить
struct T {};
T g();
g() = T{}; // Нет ошибки, хотя g() - rvalue
T", the type is adjusted to T prior to any further analysis», то есть тип выражения всегда нессылочный, ссылки просто откидываются. А раз так, то нужен какой-то другой способ различать, является ли результат выражения адресом объекта указанного типа или же самим этим объектом (значением). Вот этой роли в стандарте и служат понятия lvalue/rvalue. Если представить себе, что все встроенные операторы — это тоже вызовы каких-то функций, то если соответствующая функция возвращала бы T& — это выражение lvalue типа T, возвращала бы T&& — xvalue типа T, возвращала бы просто T — prvalue типа T. Объяснение, конечно, немного с конца к началу, т.к. в обычном C никаких ссылок не было, а понятия lvalue/rvalue были (и служили той же цели), и ссылки в C++ были введены, как способ вернуть lvalue из функции, но для C++ программиста так должно быть понятнее имхо.T&&), тем самым из результата такого выражения возможно перемещение.На самом деле все stl контейнеры хранят указатели на внутренние данныеКроме
std::arrayA simple interpretation of the mysterious value categories of C++: lvalues represent objects and rvalues represent values.
Technically these are two kinds of rvalue: expressions denoting truly abstract values are prvalues (pure), while expressions denoting short-lived objects are called xvalues (expiring) [1] §3.10.

…лямбда-выражения не принесли в язык новой функциональности (в оригинале — expressive power).
// Header file
class C {
private:
class Pimpl;
struct Pimpl_deleter {
void operator() (Pimpl* pimpl_ptr);
};
std::unique_ptr<Pimpl, Pimpl_deleter> pimpl_ptr;
};
// Source file
class C::Pimpl { ... };
void C::Pimpl_deleter::operator() (C::Pimpl* pimpl_ptr)
{ delete pimpl_ptr; }
Но вообще ваше желание странновато.template<typename T> void setName(T&& _name) {
name=std::forward<std::string>(_name);
}
std::forward<std::string>(_name) всегда вернет rvalue ссылку std::string&&, независимо от типа ссылки _name. То есть, будет работать как std::move.std::forward<T>(_name)
Аннотация к «Effective Modern C++» Скотта Майерса. Часть 2