为什么 VS 无法将右值引用绑定到指针?

Why VS fails to bind rvalue reference to a pointer?

考虑以下示例(出于假设目的):

#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。如果我 run this with C++14 (gcc 6.3) 并且结果是 2,就会发生这种情况。然而,在 VS2017 中,我得到一个错误:

Error C2664 'void f(int *&&)': cannot convert argument 1 from 'int [4]' to 'int *&&'

如果我使用 std::move 强制 xvalue f(std::move(a)); 它也适用于 VS。在这种情况下我需要使用 std::move 还是这是 VS 中的某种错误?

你的程序看起来结构良好,被 GCC 和 Clang 接受。

它似乎是 Visual Studio 编译器中的一个错误,它在编译器版本 19.28 之前一直存在,并最终在编译器版本 19.29 中得到修复。演示: https://gcc.godbolt.org/z/KbhGfhPbG