То, что автоматически обрабатывается как rvalues, это вещи без имен, а вещи, которые (очень скоро) не будут иметь имени (в случае возвращаемого значения).
T&& t
имеет имя, это t
.
Причина, по которой rvalues - это то, что ссылается на них после , что точка использования почти невозможна.
T&&
является ссылкой типа rvalue. Ссылка rvalue может связываться только с rvalue (без участия static_cast
), но в остальном это значение lvalue типа rvalue.
Тот факт, что он относится к типу rvalue, имеет значение только во время его построения , и если вы сделаете decltype(variable_name)
. В противном случае это просто другое значение ссылочного типа.
std::move(t)
выполняет return static_cast<T&&>(t);
и возвращает ссылку rvalue.
Правила, которые регулируют это, написаны стандартными в стандарте C ++. Копия / вставка из них не все так полезно, потому что их не так просто понять.
Первое общее правило: вы получаете неявный ход (aka, параметр, который привязывается к rvalue ссылочный аргумент), когда вы возвращаете именованное значение из функции или когда значение не имеет имени или когда функция явно возвращает ссылку rvalue.
Во-вторых, только ссылки rvalue и const&
могут связываться на rvalues.
В-третьих, расширение жизненного цикла ссылки на временные значения происходит, когда напрямую связано с ссылкой вне конструктора. (поскольку только ссылки rvalue и const&
могут напрямую привязываться к временному, это относится только к ним)
Forth, T&&
не всегда является ссылкой rvalue. Если T
имеет тип X&
или X const&
, тогда свертывание ссылки сворачивает T&&
в X&
или X const&
.
Наконец, T&&
в контексте вывода типа выводит T
в качестве X
, X&
, X const&
или X const&&
в зависимости от типа аргумента и, следовательно, может выступать в качестве «ссылки пересылки».
Нашел то, что было не так, и это было действительно неловко. Мой пользователь hadooop имел bash как значение по умолчанию sh, но не правильно загружал профиль, пока я не обнаружил «bash» в командной строке. Пила его командой printenv.
убедитесь, что этот каталог существует и имеет достаточное разрешение
, указывая путь как file:///usr/local/hadoop/tmp