- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先,这个问题不是Function dual to std::move?或Does the inverse of std::move exist?的重复。我不是在问一种机制,以防止在原本会发生的情况下发生移动,而是进行复制;而是我要问的是一种机制,该机制使将要绑定(bind)到可修改的左值引用的位置中的右值被接受。实际上,这与发明了std::move
的情况恰好相反(即,在要绑定(bind)到(可修改的)右值引用的位置中接受了可修改的左值)。
在我感兴趣的情况下,将不会接受右值,因为上下文需要可修改的左值引用。由于某些原因,我不太了解,但我愿意接受,一个(可修改的)右值表达式将绑定(bind)到一个常量左值引用(不引入其他临时值),但不会绑定(bind)到一个可修改的左值引用( gcc给我的错误消息是“从类型'A'的右值对类型'A&'的非常量引用进行了无效的初始化”,而clang说“对类型'A'的非常量左值引用无法绑定(bind)到临时类型'A'“;奇怪的是,即使该表达式实际上是static_cast<A&&>(...)
形式(本身不会引起错误),我也无法让这两个编译器中的任何一个承认该表达式具有类型'A &&'。我可以理解,通常不需要在需要可修改的左值引用的位置接受右值表达式,因为这意味着通过该左值引用所做的任何修改都会丢失,但是就像调用std::move
对编译器说的那样:知道这是一个左值,它将绑定(bind)到右值引用(参数),因此可能会被盗,但是我知道我在做什么,在这里也可以。”是临时的,它将绑定(bind)到可修改的左值引用(参数),因此通过左值引用进行的任何更改都不会被忽略,但是我知道我在做什么,在这里还可以。”
我可以通过从右值初始化一个类型为A的命名对象,然后在需要可修改的左值引用的地方提供名称来解决该问题。我认为这没有任何额外的运行时开销(无论如何,右值都需要一个临时的),但是必须这样做在以下几种方面很尴尬:必须引入一个虚拟名称,也许必须引入一个复合语句。保留声明,将产生右值的表达式与为其提供参数的函数调用分开。提出我的问题,是否可以在不引入虚拟名称的情况下完成此操作:
- Is there any way (for instance using a cast) to bind an rvalue expression of type A to a modifiable lvalue reference of type A& without introducing a named object of type A?
- If there is not, is this a deliberate choice? (and if so, why?) If there is, is there a mechanism similar to
std::move
provided by the standard to facilitate it?
A&
替换为
const A&
时,所有错误都会消失。
class A
{ int n;
public:
A(int n) : n(n) {}
A(const A&) = delete; // no copying
A(const A&&) = delete; // no moving either
int value() const { return n; }
};
int f(A& x) { return x.value(); }
void g()
{ A& aref0 = A(4); // error
// exact same error with "= static_cast<A&&>(A(4))" instead of A(4)
A& aref1 = static_cast<A&>(A(5)); // error
// exact same error with "= static_cast<A&&>(A(5))" instead of A(5)
f (A(6)); //error
// exact same error with "= static_cast<A&&>(A(6))" instead of A(6)
A a(7);
f(a); // this works
A& aref2 = a; // this works too, of course
}
f
,该函数的参数用作输入参数,有时也用作输出参数,用“更特殊的”值替换提供的值(该值表示树结构,并且可能已填写了一些缺少的分支) ;因此,此值作为可修改的左值引用传递。我还拥有一些全局变量,这些变量保存有有时用于为该参数提供值的值。这些值是不可更改的,因为它们已经完全专门化了。尽管具有这种恒定的性质,但我过去通常不声明这些变量
const
,因为那样会使它们不适合用作参数。但实际上,它们确实是全局常量和永久常量,因此我想重写我的代码以使其明确,并且还避免了在更改
f
的实现时偶然出错的可能性(例如,它可能决定从引发异常时使用它的参数;当该参数表示一个无论如何都将被异常破坏的局部变量时,这将是可以的,但如果将其绑定(bind)到全局“常量”,则将是灾难性的)。因此,我决定在将这些全局常量之一传递给
f
时进行复制。有一个函数
copy
可以生成并返回这样的拷贝,我想调用它作为
f
的参数;遗憾的是,
copy(c)
是一个右值,由于上述原因,这是无法做到的,尽管这种用法是绝对安全的,并且实际上比我以前的解决方案更安全。
最佳答案
最简单的解决方案是:
template<typename T>
T& force(T&& t){
return t;
}
关于c++ - 是否存在与 `std::move`相反的强制转换(或标准函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24867873/
我最近在读 CSAPP。在 10.9 节中,它说标准 I/O 不应该与 socket 一起使用,原因如下: (1) The restrictions of standard I/O Restricti
似乎是一个足够标准的问题,可以保证解决方案中的标准设计: 假设我想在文件中写入 x+2(或更少)个字符串。 x 字符串构成一个部分的内容,这两个字符串构成该部分的页眉和页脚。要注意的是,如果内容中没有
代码版本管理 在项目中,代码的版本管理非常重要。每个需求版本的代码开发在版本控制里都应该经过以下几个步骤。 在master分支中拉取该需求版本的两个分支,一个feature分支,
我有以下sql查询,我需要获取相应的hibernate条件查询 SELECT COUNT(DISTINCT employee_id) FROM erp_hr_payment WHERE payment
所以我正在编写一些代码,并且最近遇到了实现一些 mixin 的需要。我的问题是,设计混音的正确方法是什么?我将使用下面的示例代码来说明我的确切查询。 class Projectile(Movable,
我的环境变量包含如下双引号: $echo $CONNECT_SASL_JAAS_CONFIG org.apache.kafka.common.security.plain.PlainLoginModu
示例: /** * This function will determine whether or not one string starts with another string. * @pa
有没有办法在 Grails 中做一个不区分大小写的 in 子句? 我有这个: "in"("name", filters.tags) 我希望它忽略大小写。我想我可以做一个 sqlRestriction
我搜索了很长时间,以查找将哪些boost库添加到std库中,但是我只找到了一个新库的完整列表(如此处:http://open-std.org/jtc1/sc22/wg21/docs/library_t
我已经通过使用这个肮脏的黑客解决了我的问题: ' Filter managerial functions ActiveSheet.Range("$A$1:$BW$2211").Auto
因此,我很难理解我需要遵循的标准,以便我的 Java 程序能够嵌入 HTML。我是否只需将我的主类扩展到 Applet 类,或者我还需要做更多的事情吗?另外,在我见过的每个 Applet 示例中,它都
我对在 Hibernate 中使用限制有疑问。 我必须创建条件,设置一些限制,然后选择日期字段最大值的记录: Criteria query = session.createCriteria(Stora
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我很难编写条件来选择所有子集合或孙集合为空的实体。我可以将这些作为单独的条件来执行,但我无法将其组合成一个条件。 类结构: public class Component { p
@Entity class A { @ManyToMany private List list; ... } @Entity class B { ... } 我想使用条件(不是 sql 查询)从 A
我的数据库中有以下表结构: Table A: Table B: Table C: _______________
请帮助我: 我有下一张 table : 单位 ID 姓名 用户 ID 姓名 利率 单位 ID 用户 ID 我不明白如何从 SQL 创建正确的条件结构: 代码: SELECT * FROM Unit W
我正在构建一个包含项目的网站,每个项目都有一个页面,例如: website.com/book/123 website.com/film/456 website.com/game/789 每个项目都可以
我需要使用两个属性的组合来过滤结果列表。一个简单的 SQL 语句如下所示: SELECT TOP 10 * FROM Person WHERE FirstName + ' ' + LastName L
我有一个“ super 实体”SuperEntity 和三个扩展父类(super class)的实体 ChildEntity1、...、ChildEntity3。 搜索数据库中的所有实体很容易,即我们
我是一名优秀的程序员,十分优秀!