[英]How many times the constructors are called?
我很困惑std :: move的东西。 假设我有这段代码:
string foo() {
string t = "xxxx";
return t;
}
string s = foo();
调用字符串构造函数的次数是多少? 是2还是3? 编译器是否会使用此行的移动?
string s = foo();
如果是这样,在函数中我甚至没有返回rvalue引用,那么编译器怎么能调用move构造函数呢?
这取决于编译器。 在这种情况下,标准要求至少有一个构造函数调用。 即, t
的构造。
但是标准允许两个人的可能性:布展施工的价值输出的foo
从t
,和布展施工s
从价值输出foo
。 大多数体面的编译器都会通过直接在s
的内存中构造t
来放弃这些构造函数。 这种优化是可能的,因为标准允许在编译器选择不执行时调用这些构造函数。
这称为复制/移动“省略”。
如果是这样,在函数中我甚至没有返回rvalue引用,那么编译器怎么能调用move构造函数呢?
你似乎在误解“ &&
意味着“移动”,并且如果没有&&
某个地方,那么运动就不会发生。 或者移动建设需要move
,这也不是真的。
C ++以某种方式指定,某些地方的某些表达式被认为是有效的。 这意味着该值或参考将试图绑定到&&
结合到前参数&
参数。 例如,Temporaries将在const&
one之前优先绑定到&&
参数。 这就是为什么用于构造该类型值的临时工具将被移除。
如果你有一个返回某个类型T
的值的函数,并且返回表达式的形式为return x
,其中x
是自动存储持续时间类型T
的命名变量(即:函数参数或堆栈变量),则该标准要求此返回表达式move构造x
的返回值。
foo
的返回值是暂时的。 C ++的规则要求temporaries在const&
之前绑定到&&
参数。 所以你将结构转移到s
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.