右值和转发对 C 样式数组的引用

Evg*_*Evg 5 c++ rvalue-reference perfect-forwarding c++11

在使用右值和转发对 C 风格数组的引用时,我偶然发现了奇怪的行为。起初我认为这是由于我缺乏对 C 风格数组如何绑定到引用的理解,但现在,在阅读了此相关问题&&后,这似乎是一个 MS C++ 编译器错误。

代码:

#include <boost/type_index.hpp>
#include <iostream>
#include <utility> 

template<typename T>
void foo(T&&) {
    std::cout << boost::typeindex::type_id_with_cvr<T>() << '\n';
}

void bar(int(&)[2]) {
    std::cout << "int(&)[2]\n";
}

void bar(int(&&)[2]) {
    std::cout << "int(&&)[2]\n";
}

int main() {
    int arr[2];
                         //          MSVS 2018 / gcc 7.1.0 & clang 5.0.0
    foo(arr);            // Outputs: int(&)[2] / int(&)[2]
    foo(std::move(arr)); // Outputs: int(&)[2] / int[2]

    bar(arr);            // Outputs: int(&)[2] / int(&)[2]
    bar(std::move(arr)); // Outputs: int(&)[2] / int(&&)[2]

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc/clang 就在这里吗?这可以归类为 MS 编译器错误吗?