自动右值参考(不带\u0026\u0026)到C 14中的数组
作者:互联网
回复帖子1
How to declare array with auto工作正常:
template<typename T> using unsized_raw_array = T[];
auto &&z = unsized_raw_array<int>{1, 2, 3};
尝试相同但没有双&符号(&&)会导致clang和gcc的不同行为:
template<typename T> using unsized_raw_array = T[];
auto z = unsized_raw_array<int>{1, 2, 3};
我预计这是一个错误,因为它是一个rvalue(通用/转发/临时对象)引用,并且缺少双&符号(&&).这就是gcc 6.3.0所发生的事情:
>错误:获取临时数组的地址
但是,clang 3.9.1会成功编译并执行它,允许在下一个语句中打印数组的值.我只收到这个警告(在某些情况下我甚至没有得到警告):
>警告:指针由一个临时数组初始化,该数组将在全表达式结束时被销毁[-Waddress-of-array-temporary]
哪个编译器正确?
解决方法:
铿锵是对的;见[conv.array]:
An lvalue or rvalue of type “array of
N
T
” or “array of unknown bound ofT
” can be converted to a prvalue
of type “pointer toT
”. The result is a pointer to the first element of the array.
即使数组是临时的,因此也是prvalue,在它上执行数组到指针的转换是合法的.
似乎在解决gcc bug 53220的补丁中引入了将数组prvalues转换为指针的限制.似乎在线程上出现了允许转换是危险的共识,因为从数组初始化指针变量不会延长生命周期阵列.但是,将这些代码视为格式错误并不是正确的解决方案,因为正如后面的线程中所指出的那样,可以以安全的方式使用此转换,例如,如果将数组传递给获取指针的函数(因此将一直存在直到函数返回).
你可能不得不提交一个针对gcc的新bug,以便让他们解决问题.
标签:c,arrays,auto,c14,rvalue-reference 来源: https://codeday.me/bug/20190823/1701022.html