C++ 给出is_数组冲突结果的等效静态_断言<&燃气轮机;

C++ 给出is_数组冲突结果的等效静态_断言<&燃气轮机;,c++,c++14,perfect-forwarding,universal-reference,forwarding-reference,C++,C++14,Perfect Forwarding,Universal Reference,Forwarding Reference,在以下代码段中,一个静态断言通过,另一个断言失败: 模板constepr bool是数组(Rng&r){ //int***debug=r;//将其取消注释为debug r的类型 返回std::is_数组{}; //返回std::is_数组{};//也失败 } inta[5]={0,1,2,3,4}; 静态_断言(std::is_数组{},“”;//通行证 静态断言(是数组(a),“”);//失败 提示:删除注释以调试类型(正确推断为int[5]) 为什么会这样?在叮当作响的树干上测试 我猜这与

在以下代码段中,一个静态断言通过,另一个断言失败:

模板constepr bool是数组(Rng&r){
//int***debug=r;//将其取消注释为debug r的类型
返回std::is_数组{};
//返回std::is_数组{};//也失败
}
inta[5]={0,1,2,3,4};
静态_断言(std::is_数组{},“”;//通行证
静态断言(是数组(a),“”);//失败
提示:删除注释以调试类型(正确推断为
int[5]

为什么会这样?在叮当作响的树干上测试

我猜这与数组退化为指针有关。。不知怎么的

解决方案:使用
std::remove_reference\u t
Rng
将是
int(&)[5]
,这是对数组的引用,而不是数组

Xeo补充道:

模板结构转储;
转储{};
将无法编译并显示正确类型的
r


int****j=r
产生了一个错误(说不能将
int[5]
分配给
int****
)。

Rng的类型是
int(&)[5]
,它是对数组(而不是数组)的引用,因此
std::is\u array
返回
false\u type


可以删除引用(例如,使用
std::remove_reference_t
)使其按预期工作。

尝试插入
remove_reference
@KerrekSB有意义且有效,废话。铿锵的错误消息把我甩了,它说不能将
int[5
]分配给
int***
,而不是
int(&)[5]
或类似的。Scott Meyers查看
t
类型的技巧是
模板类TD/*未定义*;运输署副署长,。这个问题现在应该结束吗?