人们在听到这个时感到困惑
int&& x
x 具有右值引用类型,但 x 是左值。误解源于标识符和表达式是不同的事物,类型和值类别也是如此。此外,表达式的类型“在任何进一步分析之前进行调整”,“rvalue”和“lvalue”这两个词可以出现在类型名称和值类别名称中。
我想澄清正式的定义。假设我们有一个函数:
1 | void f(int&& x) {
2 | ... = x;
3 | ... = std::move(x);
4 | }
下列说法正确吗?
x 是一个标识符(id 表达式),用于命名函数参数。它的类型是 int&&,这是 decltype(x) 返回的类型。 x 不是表达式,没有值类别。x 是一个表达式。类型调整前其类型为int&&,类型调整后为int。值类别是左值。std::move(x) 是一个表达式。调整前的类型为int&&,调整后为-int。值类别是 xvalue。x 具有右值引用类型时,我们要么将 x 的类型称为标识符,要么将 x 的类型称为code> 作为类型调整前的表达式。T& 或 const T& 等),则该表达式是左值。” he指的是调整前的类型,第二个单词“lvalue”指的是值类别。最佳答案
首先是一些初步的段落:
[basic]
3 An entity is a value, object, reference, function, enumerator, type, class member, template, template specialization, namespace, parameter pack, or this.
[dcl.type.simple]
4 The type denoted by
decltype(e)is defined as follows:
if
eis an unparenthesized id-expression or an unparenthesized class member access ([expr.ref]),decltype(e)is the type of the entity named bye. If there is no such entity, or if e names a set of overloaded functions, the program is ill-formed;otherwise, if
eis an xvalue,decltype(e)isT&&, whereTis the type ofe;otherwise, if e is an lvalue,
decltype(e)isT&, whereTis the type ofe;otherwise,
decltype(e)is the type ofe.[dcl.ref]
1 In a declaration
T DwhereDhas either of the forms& attribute-specifier-seqopt D1 && attribute-specifier-seqopt D1and the type of the identifier in the declaration
T D1is “derived-declarator-type-listT,” then the type of the identifier ofDis “derived-declarator-type-list reference toT.”[expr]
5 If an expression initially has the type “reference to
T” ([dcl.ref], [dcl.init.ref]), the type is adjusted toTprior to any further analysis. The expression designates the object or function denoted by the reference, and the expression is an lvalue or an xvalue, depending on the expression.[expr.prim.general]
8 An identifier is an id-expression provided it has been suitably declared (Clause [dcl.dcl]). The type of the expression is the type of the identifier. The result is the entity denoted by the identifier. The result is an lvalue if the entity is a function, variable, or data member and a prvalue otherwise.
[expr.call]
10 A function call is an lvalue if the result type is an lvalue reference type or an rvalue reference to function type, an xvalue if the result type is an rvalue reference to object type, and a prvalue otherwise.
现在我们可以回答您的问题。
In the line 1,
xis an identifier (id-expression) that names a function parameter. Its type isint&&, and this is the type thatdecltype(x)returns.xis not an expression and has no value category.
是的。 x在声明中不是表达式。但作为 decltype 的论据是一个表达式。但是,它遇到了 decltype 的特殊情况。的第一个项目符号,因此 x 命名的标识符的类型推导出来,而不是 x 的类型作为表达式。
In the line 2,
xis an expression. Before type adjustment its type isint&&, and after the type becomesint. The value category is lvalue.
是的。
In the line 3,
std::move(x)is an expression. Its type before adjustment isint&&, after -int. The value category is xvalue.
是的。
When we say that
xhas rvalue reference type, we refer either to the type ofxas an identifier, or to the type ofxas an expression before type adjustment.
是的。
The word "type" in the statement "Each expression has some non-reference type, and each expression belongs to exactly one of the three primary value categories" at cppreference.com refers to the type after type adjustment.
是的。
When Scott Meyers writes "If the type of an expression is an lvalue reference (e.g.,
T&or constT&, etc.), that expression is an lvalue." he refers to the type before adjustment, and the second word "lvalue" refers to the value category.
无法确定 Scott Meyers 写这篇文章时的意思,但这是对符合标准的词语的唯一解释,是的。
关于c++ - 右值、左值和正式定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56716647/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我使用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"=>
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是