在玩右值并转发对C样式数组的引用时,我偶然发现了奇怪的行为。起初,我认为这是由于我不了解C样式数组如何绑定到&&
引用,但是现在,在阅读此related question之后,这似乎是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;
}
gcc / clang在这里吗?可以将其归类为MS编译器错误吗?