【发布时间】:2019-12-17 17:32:46
【问题描述】:
这里有一些代码:
int main()
{
using T = int[3];
T a;
a = T{};
}
据我所知,根据 C++17 标准,这段代码是正确的,但是我尝试的每个编译器都拒绝了它。
这段代码真的不正确吗?如果是这样,该标准的哪些条款?
到目前为止我的调查:在 C 和旧版本的 C++ 中,代码不正确,因为赋值运算符的左操作数必须是可修改的左值,a 要么不是,要么没有明确说明。但是由于 C++17 a 被明确指定为可修改的左值(C++17 [basic.lval]/7)。
这里没有应用数组到指针的转换:[expr.ass] 没有明确指定它,[expr]/9 和 [expr]/10 似乎不适用:=期望一个纯右值作为右操作数,并且提供了一个纯右值。 (并且它期望一个左操作数作为左操作数,并且提供了一个左值)。如果在期望prvalue的地方提供了glvalue,则这些条款适用,反之亦然。
[expr.ass]/3 表示右表达式被隐式转换为左操作数的类型。但由于双方都有相同的类型int[3],似乎不需要转换。
所以我没有看到将 [expr.ass]/2 排除在应用之外的条款,即右侧的值存储在左侧引用的对象中。
最新的草案围绕 [basic.lval]/7 和 [expr]/9-10 中的条款移动,但似乎没有改变它们的含义,它甚至重新措辞 [expr.ass]/ 2更清楚:
在简单赋值 (
=) 中,左操作数引用的对象通过将其值替换为右操作数的结果来修改。
【问题讨论】:
-
“但是由于 C++17
a被明确指定为可修改的左值 (C++17 [basic.lval]/7)。” -- 五月您引用该相关文本以供方便参考? -
所以你想为你的变量分配一个未初始化的值?
-
@iammilind see here
-
@SidS
T{}将所有数组元素初始化为0
标签: c++ arrays language-lawyer c++17 variable-assignment