问题标签 [reference-binding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如果没有 const 引用,临时对象会被删除吗?
让我们看一下这两个函数:
这里有两个可能的调用process_c_string
with 参数返回的get_string
。
没有绑定 const 对返回对象的引用
/li>get_string
。使用绑定 const 引用返回的
/li>get_string
.
我知道第二种方法是有效的,但是第一种方法呢,标准对这种情况有什么看法?返回的临时对象会不会因为不存在而在完成get_string
前被删除?process_c_str
const reference
注意:这两个版本在 MSVC 中都可以。
c++ - 这个 C++ 静态分析规则是否有意义?
我正在实现一些 C++ 静态分析规则,其中一个禁止函数返回引用或指向函数的引用参数的指针,即以下都是不合规的:
对此给出的理由是“无论引用参数是临时对象还是对参数的引用,都是实现定义的行为。”
但是,我对此感到困惑,因为 C++ 中的流运算符是这样编写的,例如
我认为我非常有信心 C++ 中的流运算符通常不会表现出实现定义的行为,那么发生了什么?
根据我目前的理解,我希望 #1 和 #3 是明确定义的,基于临时对象不能绑定到非常量引用,因此int& x
指的是具有超出范围的生命周期的真实对象函数,因此返回对该对象的指针或引用就可以了。我希望 #2 是狡猾的,因为临时可能已绑定到const int& x
,在这种情况下,尝试获取其地址似乎是一个糟糕的计划。我不确定#4 - 我的直觉是这也可能是狡猾的,但我不确定。特别是,我不清楚在以下情况下会发生什么:
c++ - 从“const char *”类型的右值对“const char*&”类型的非常量引用进行无效初始化
我做了一个 mystrcpy 函数,
和一个主要功能:
它不编译,并说“从'const char *'类型的右值对'const char *&'类型的非常量引用的初始化无效”......
当我这样做时:
它编译没有错误。
我需要知道为什么前一个不起作用,谢谢。
c++ - 使用placement new 来更新参考成员?
以下代码在 C++ 中合法吗?
引用不应该被绑定两次,对吧?
c++ - 引用初始化和直接与间接绑定
考虑以下情况
规范在http://eel.is/c++draft/dcl.init.ref#5中说明了引用绑定是直接的还是间接的
在除了最后一种情况(即,从初始化表达式创建和初始化一个临时变量)之外的所有情况下,引用都被称为直接绑定到初始化表达式。
上面的情况与最后一个不匹配,而是倒数第二个。
如果 T1 或 T2 是类类型,并且 T1 与 T2 没有引用相关,则考虑用户定义的转换... 调用转换函数的结果,如非引用复制初始化所述,则为用于直接初始化引用。
因此对A()
引用的绑定是间接绑定。为了继续,我们将再次递归到引用初始化,现在使用 prvalue 类型int
,尝试初始化int&&
。现在我们将结束最后一个项目符号,这意味着直接绑定。
那么对于引用的绑定我们能说些什么……它是直接绑定还是间接绑定?它是否两者都做,取决于您考虑的表达式(初始化表达式与转换函数调用的结果)?
特别是在我们的例子中,这些段落似乎说我们直接绑定到初始化表达式并间接绑定到初始化表达式的转换结果。但是,在关于重载解决的章节http://eel.is/c++draft/over.ics.ref中,我们只区分
- 当引用类型的参数直接绑定 ([dcl.init.ref]) 到参数表达式时,
- 如果参数直接绑定到将转换函数应用于参数表达式的结果,
- 当引用类型的参数不直接绑定到参数表达式时,
对于像这样的情况
案例 1 适用,但我很确定它不打算适用。我的直觉是,“在除最后一个之外的所有情况下”不仅旨在匹配创建临时案例,而且还匹配倒数第二个项目符号,或者替代包含两个项目符号的整个“否则:”分支(即“最后一个”是指项目符号层次结构上的不同级别)。你能澄清一下吗?
c++ - 'std::string& 类型的非常量引用的无效初始化
我试图rtrim()
在不使用算法的情况下使用 c++ 中字符串头中的函数来修剪字符串。
我所做的是通过是否存在空间来检查开始和结束位置,只需使用将其删除,isspace()
但是当我编译时,现在出现此错误:
从 'const char*' 类型的右值对类型 'std::string& {aka std::basic_string&}' 的非常量引用的无效初始化</p>
这是我的代码:
每当我设置诸如string s = ( "hello world\t ");
和运行之类的参数时,cout << rtrim(s) << endl;
它似乎正在工作,但它不像上面的代码那样工作。有什么建议么?
c++ - const 引用是否会延长临时对象返回的临时对象的寿命?
我知道 const 引用可以延长本地临时对象的寿命。现在我问自己是否可以在一个临时对象链上扩展这种适当性,也就是说,如果我可以安全地定义:
我的感觉是,由于第一种方法aBar.getTemporaryObject1()
返回的已经是一个临时对象,因此不适合aBar.getTemporaryObject2()
.
c++ - 为什么 rval ref 绑定到 lval ref 函数?
在下面的代码中,is_rvalue_reference
返回 true。我希望testRef(int &&)
被调用而不是testRef(int &)
,但事实并非如此(至少使用我的 Visual Studio 2015 编译器)。
知道原因吗?
请注意,这与Rvalue Reference is Treated as an Lvalue?中的问题不同。
在那篇文章中,他们谈论的是函数内部的变量:这就像在我的示例中询问变量 i 是右值还是左值(答案是在两种情况下它都是左值,因为它在两种情况下都有地址)。
拥有右值和的全部意义std::move
,它是右值的强制转换,是允许在函数和构造函数中选择正确的重载。例如,以下两种情况都解析为调用testRef(int && i)
:
但是对于右值引用,情况似乎并非如此。
c++11 - shared_ptr到 const shared_ptr&
我对 shared_ptr 感到困惑,我的主要问题是:当我执行以下操作时,c++ 是否会创建一个新对象(shared_ptr 对象)?
显然,Func1(v1)
是由 ref 传递的。但是,怎么样Func2(v1)
?
编译器会在后面做以下事情吗?
我关心它,因为Func2
可能比Func1
.
非常感谢您的帮助!