当我使用函数生成一个新线程(std::thread
)时,该函数的参数
是按价值 - 不是通过参考。
因此,如果我使用引用参数(int& nArg
)定义该函数
我的编译器(mingw 4.9.2)输出一个错误(在compilian-suaeli中就像是
“缺少复制构造函数”我猜; - )
但是,如果我将参考参数const(const int& nArg
)设为它,则不会抱怨。
有人可以解释一下吗?
答案 0 :(得分:1)
如果您想传递参考,由于std::reference_wrapper
,您必须将其包装到std::ref
。像:
<!DOCTYPE html>
<html>
<head>
<!-- Default stylesheet provided with App.js.
Contains iOS/Android styles for all included widgets. -->
<link rel="stylesheet" href="//cdn.kik.com/app/2.0.1/app.min.css">
</head>
<body>
<!-- Page1 -->
<div class="app-page" data-page="page1">
<div class="app-topbar">
<h1>Page 1</h1>
</div>
<div class="app-content">
<img src="https://upload.wikimedia.org/wikipedia/commons/1/13/Red_squirrel_%28Sciurus_vulgaris%29.jpg">
<img src="https://upload.wikimedia.org/wikipedia/commons/d/d5/Lightmatter_lioness.jpg">
<div class="app-button" data-target="page2">Go to page 2</div>
<p>Click the images. If nothing happens, go to page2 and then back to page1 and try clicking again to see the problem I'm experiencing:
<strong>The clicked image disappears when clicked which makes the page transition look messy.</strong></p>
</div>
</div>
<!-- Page2 -->
<div class="app-page" data-page="page2">
<div class="app-topbar">
<h1>Page 2</h1>
</div>
<div class="app-content">
<div id="clicked-img-container"></div>
<div class="app-button" data-target="page1">Go to page 1</div>
</div>
</div>
<!-- jQuery-like library focusing on being lightweight and mobile-friendly -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/zepto/1.2.0/zepto.min.js"></script>
<!-- core module containing all library functionality -->
<script src="//cdn.kik.com/app/2.0.1/app.min.js"></script>
</body>
</html>
答案 1 :(得分:0)
std::thread
的参数只使用过一次。
实际上,它将它们存储在std::tuple<Ts...> tup
中。然后它执行f( std::get<Is>(std::move(tup))...)
。
传递std::get
右值tuple
意味着它可以从元组中的值或右值引用字段中获取状态。如果没有元组是一个右值,它会给它一个引用。
除非您使用reference_wrapper
(即std::ref
/ std::cref
),否则您传递给std::thread
的值会在中存储为值 std::tuple
。这意味着您调用的函数将rvalue传递给std::tuple
中的值。
rvalues可以绑定到const&
但不能绑定到&
。
现在,上面的std::tuple
是一个实现细节,是std::thread
的想象实现。标准中的措辞更加迟钝。
为什么标准会说这种情况发生?通常,您不应将&
参数绑定到将立即丢弃的值。该函数认为它正在修改调用者可以看到的内容;如果该值将立即被丢弃,这通常是调用者的错误。
const&
参数会绑定到将立即丢弃的值,因为我们将它们用于提高效率目的,而不仅仅是为了参考目的。
或者,粗略地说,因为
const int& x = 7;
是合法的
int& x = 7;
不是。第一个是逻辑上丢弃的对象const&
(由于参考生命周期延长,它不是,但它在逻辑上是暂时的)。