繁体   English   中英

下标运算符中的逗号运算符?

[英]Comma Operator in subscript operator?

我对逗号运算符感到很困惑。 我从来没有见过这样语法的代码? 但我很好奇它是否在任何地方有用? 为什么它在 c++20 中被弃用?

#include <iostream>
int main()
{
    int  a[5]{1,2,3,45,5};
    std::cout << a[(2,3)] <<'\n';  //  this is work , in c++17 works
    std::cout << a[2,3] << '\n';   // but this is deprecated in c++20 ,in c++17 works
    return 0;
}

重要的是要认识到逗号作为表达式运算符和逗号作为某种语法术语之间的分隔符之间的区别。 它们使用相同的标点符号,但含义不同。

在花括号初始化列表的{}中,各个术语用逗号分隔。 所以{1,2,3,45,5}是一系列项。 这是一个逗号分隔符。

但是,在通用表达式中,逗号充当表达式运算符。 当逗号是两个表达式项之间的表达式运算符时,表示先计算左边的表达式,丢弃它的结果,然后再计算右边的表达式,这是整个表达式的结果。

[]中,逗号不是C++17 中的分隔符。 因此,它充当表达式运算符。 a[2,3]表示评估 2,丢弃它,然后评估 3。所以使用的索引将是 3。

C++20 不赞成将逗号表达式作为[]中使用的直接表达式。 这样做是为了让 C++ 标准的未来版本可以自由地将[]中的逗号变成逗号分隔符,而不是逗号运算符。 也就是说, [2, 3]使 2 和 3 成为调用重载operator[]的参数。

这类似于 function 的参数如何使用分隔符逗号。 因此,如果您需要在 function 调用中的两个表达式上使用运算符逗号,则必须将它们包装在() : func(1, (2, 3))中。 此 function 采用两个参数,第二个参数是逗号运算符应用于其术语的结果。

不推荐使用它的主要原因是希望将来将语法用于多维下标运算符。

您已经说过不推荐使用它的其他三个原因:

  • 在实践中很少使用
  • 人们在使用它时经常会感到困惑,这是怎么回事
  • 人们很难思考为什么允许这样做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM