Рассмотрим следующий пример (в гипотетических целях):
#include <iostream>
void f(int *&&b)
{
++b;
std::cout << *b;
}
int main()
{
int a[] = { 1,2,3,4 };
f(a);
}
По моему скромному пониманию, массив a
распадается на int *
, который является временным и, следовательно, значением, и int *&&b
должен счастливо с ним связываться и продлевать свой срок действия для объема функции f
, И это то, что происходит, если я запускаю это с C ++ 14 (gcc 6.3) и получается 2
. Однако в VS2017 я получаю сообщение об ошибке:
Ошибка C2664 «void f (int * &&)»: невозможно преобразовать аргумент 1 из «int»
[4] 'до' int * && '
Если я использую std::move
для принудительной установки значения xvalue f(std::move(a));
, это также работает в VS. Нужно ли использовать std::move
в этом случае или это какая-то ошибка в VS?