草庐IT

c++ - 临时数组的元素本身不是右值吗?

coder 2023-11-14 原文

using intArray = int[];
int (&a) [4] = intArray{1, 2, 3, 4};

这是不允许的,因为将非常量左值引用绑定(bind)到临时(右值)是非法的。 g++ 4.9.1 和 clang 3.4.2 都报错了;当 a 时编译正常是const合格

int const (&a) [4] = intArray{1, 2, 3, 4};

但是,当我这样做的时候

int &x = intArray{1, 2, 3, 4} [1];

两个编译器都能很好地编译它,没有错误。为此挖掘标准(草案 N3337),§5.2.1 Subscripting

1 A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall have the type “pointer to T” and the other shall have unscoped enumeration or integral type. The result is an lvalue of type “T.” The type “T” shall be a completely-defined object type. The expression E1[E2] is identical (by definition) to *((E1)+(E2))

2 A braced-init-list shall not be used with the built-in subscript operator.

  1. 如果我选择 1 那么我不明白为什么标准允许构造临时数组,因为在其中下标一个元素会给出一个左值,即我可以获得一个左值来自与临时对象的原始概念相矛盾的临时对象只能绑定(bind)到 const 左值引用或右值引用。

  2. 如果我选择 2 那么为什么编译器在我执行 {1, 2, 3, 4}[1] 时不抛出错误? ?

最佳答案

问题一

关于不将临时值绑定(bind)到左值的规则不提供铁定的安全性。它可以防止部分此类错误,但不是全部。我怀疑为了防止所有此类错误,“临时性”的概念需要纳入类型系统,就像 const 一样。 .然后,如果您知道您不会将引用保留的时间超过临时文件的生命周期,那么您可以“放弃临时性”。委员会已经决定我们的规则是值得的,大概他们也已经决定进一步努力是不值得的。

再举个例子,vector<int>(4)[0]即使 operator[] 也返回一个左值电话是临时打的。该标准不会因此而禁止构造临时 vector ,我也不认为它应该禁止临时数组。好的,所以 vector是用户定义的类型,而数组是内置的,但除此之外,我认为情况相似。

如果您完全使用数组,尤其是临时数组,那么在某种程度上,标准认为您得到了应得的。它不会仅仅因为可以从一个数组中获取左值而禁止临时数组。

不过,我认为您的一般观点是有效的。下标可能可以在数组右值上更安全地定义,因为编译器有必要的信息。它可以计算出一个右值,其值为相应数组元素的值。这可能会令人困惑或不方便,因为它与通常的下标表达式不一致,但它会更安全:-) 如果你写 struct A {int a;} , 然后 A().a是一个右值,所以我不认为将这个原则应用于数组是完全不可能的。这当然是一个突破性的变化。

问题2

您没有在 braced-init-list 上使用下标。您在恰好使用新型初始化语法构造的临时对象上使用它。也就是说,你的表达式解析(intArray{1, 2, 3, 4})[1] , 不是 intArray({1, 2, 3, 4}[1]) .

关于c++ - 临时数组的元素本身不是右值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24800112/

有关c++ - 临时数组的元素本身不是右值吗?的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  9. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  10. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

随机推荐