C++ 对C+;中的数组进行自动右值引用(不带&;)+;14

C++ 对C+;中的数组进行自动右值引用(不带&;)+;14,c++,arrays,c++14,rvalue-reference,auto,C++,Arrays,C++14,Rvalue Reference,Auto,帖子的答案1 工作正常: template<typename T> using unsized_raw_array = T[]; auto &&z = unsized_raw_array<int>{1, 2, 3}; 我认为这是一个错误,因为它是一个右值(通用/转发/临时对象)引用,并且缺少双符号(&&)。gcc 6.3.0就是这样的: 错误:获取临时数组的地址 但是,Clang3.9.1成功编译并执行它,允许在下一个语句中打印数组的值。我只收到此警

帖子的答案1 工作正常:

template<typename T> using unsized_raw_array = T[];
auto &&z = unsized_raw_array<int>{1, 2, 3};
我认为这是一个错误,因为它是一个右值(通用/转发/临时对象)引用,并且缺少双符号(
&&
)。gcc 6.3.0就是这样的:

  • 错误:获取临时数组的地址
但是,Clang3.9.1成功编译并执行它,允许在下一个语句中打印数组的值。我只收到此警告(在某些情况下,我甚至没有收到警告):

  • 警告:指针由临时数组初始化,该数组将在完整表达式[-Waddress of array temporary]末尾被销毁。

哪个编译器是正确的

实际上,这两个编译器可能都是对的!虽然我不确定具体的情况(有人愿意查找),但是有很多情况下C++标准只需要给出任何诊断,但是不强制指定一个特定的诊断,所以错误或警告只能符合标准。
此外,请查看编译器标志-大多数(包括)编译器允许通过标志将警告转换为错误…

Clang是正确的;请参阅[conv.array]:

类型为“数组of
N
T
”或“数组of
T
”的左值或右值可以转换为PR值 类型为“指向
T
”的指针。结果是指向数组第一个元素的指针

即使该数组是临时数组,因此是prvalue,对其执行数组到指针的转换也是合法的

似乎将数组prvalues转换为指针的限制是在解决此问题的修补程序中引入的。线程上似乎达成了共识,即允许转换是危险的,因为从数组初始化指针变量不会延长数组的生存期。但是,将此类代码视为格式错误并不是正确的解决方案,因为正如线程后面所指出的,可以以安全的方式使用此转换,例如,如果数组被传递给一个带指针的函数(因此将一直存在到函数返回为止)


您可能必须针对gcc提交一个新的bug,才能让他们解决问题。

我知道您的意思,我遇到了与您几周前描述的类似的情况。然而,我不确定这是否是其中一种情况,两者都可能是正确的。。。关于编译器标志,我只是想知道什么是正确的方法,而不是让我的代码编译。谢谢。在这种情况下,为什么clang会输出一个警告,说数组
将在完整表达式的末尾被销毁?如果我理解正确,这意味着在该语句之后,数组将被销毁,因此不可访问。但是,我可以访问并打印阵列的内容,因此它似乎没有像clang建议的那样被破坏。非常感谢您的帮助。@JL这是真的,阵列被摧毁了。在语句结束后尝试访问它会导致未定义的行为。
template<typename T> using unsized_raw_array = T[];
auto   z = unsized_raw_array<int>{1, 2, 3};