【问题标题】:Why VS fails to bind rvalue reference to a pointer?为什么 VS 无法将右值引用绑定到指针?
【发布时间】: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 *&amp;&amp;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


【解决方案1】:

您的程序看起来格式正确,并且被 GCC 和 Clang 接受。

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

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2016-06-10
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多