其他分享
首页 > 其他分享> > 自动右值参考(不带\u0026\u0026)到C 14中的数组

自动右值参考(不带\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 of T” can be converted to a prvalue
of type “pointer to T”. 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