为什么 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
考虑以下示例(出于假设目的):
#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