【发布时间】:2018-06-30 17:55:02
【问题描述】:
考虑以下示例(出于假设目的):
#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 中,我得到一个错误:
错误 C2664 'void f(int *&&)': 无法从 'int 转换参数 1 [4]' 到 'int *&&'
如果我使用 std::move 强制 xvalue f(std::move(a)); 它也适用于 VS。在这种情况下我需要使用std::move 还是这是 VS 中的某种错误?
【问题讨论】:
-
有趣的是,GCC 很乐意使用隐式强制转换执行等效操作,所以我倾向于相信 VS 在这里进行更改:godbolt.org/g/oLZB4a
-
@Frank 您的示例在 VS 中编译和运行也没有问题
-
我认为问题归结为衰减操作是否等同于静态转换(适用于 VS)。
-
请注意,VC 确实接受 "f((int[]) { 1, 2, 3 });"带有关于强制转换是非标准类型转换语法的警告。并且 f(a) 需要 std::move() 是有道理的,如果这种转换在没有移动的情况下是合法的,那么拥有它就没有意义了。
-
@SornelHaetir 我有 15.7.4 和
f((int[]) { 1, 2, 3 });生成错误
标签: c++ visual-c++ rvalue-reference