草庐IT

port-forward

全部标签

C++11 std::forward 一个指针

我有一个Signal我的应用程序中的类为类提供了公开事件的选项(与.NET中相同)。类(class)正常,一切顺利。昨天我看到thisSOquestion(anditsanswer)并熟悉std::forward.我决定尝试在我的代码中使用它,所以我更改了每个std::function至std::function在raise函数(operator())中,我使用了我在上面链接中看到的相同逻辑,所以现在该函数采用Args&&...args并且回调使用std::forward(args)...这是我的Signal类的简化版本(为了使其成为一个很好的示例而进行了一些更改):templatec

c++ - 为什么 std::forward 在这种情况下没用

我注意到std::forward在这种情况下是无用的:voidconsumeObject(std::unique_ptr&&robj){myvector.emplace_back(std::forward>(robj));}这是为什么呢?我认为当一个右值引用绑定(bind)到一个函数参数时(即我可以通过名称引用它)它在那个范围内变成了一个左值并且为了向前传递需要被转换为一个右值引用(就像在完美转发中一样).为什么它是错误的/没用的? 最佳答案 使用std::forward并没有错误在这里(本身),但它是不合适的,因此具有误导性(从这

c++ - 了解 std::forward

为什么编译器无法推导出std::forward的模板参数?我的意思是:#include#includestructX{};structA{A(constX&){std::coutT*factory(Arg&&a){returnnewT(std::forward(a));//----------^^^^^^^^^^^^^^^error:can'tdeducetemplateparameter}intmain(){factory(foo());}我知道这是一个设计选择(由于std::forward定义中的std::remove_reference)以避免用户忘记指定类型.我无法得到的是:为

c++ - 将 std::forward 与 auto&& 一起使用是正确的做法吗

尝试了解将std::forward与auto&&变量一起使用是否是传递这些变量以允许移动的正确方法。假设有一个函数:voidmoveWidget(Widget&&w);调用者-引用右值和左值的两个变量:Widgetw;auto&&uniRefLV=w;//lvalueinitialiser,//uniRefLV'stypeisWidget&auto&&uniRefRV=std::move(w);//rvalueinitialiser,//uniRefRV'stypeisWidget&&我们知道auto&&类型的变量是通用引用,因为发生了类型推导。这意味着uniRefRV和uniRefL

c++ - std::apply forward parameters 如何在没有显式 std::forward 的情况下应用?

考虑std::apply的可能实现:namespacedetail{templateconstexprdecltype(auto)apply_impl(F&&f,Tuple&&t,std::index_sequence){returnstd::invoke(std::forward(f),std::get(std::forward(t))...);}}//namespacedetailtemplateconstexprdecltype(auto)apply(F&&f,Tuple&&t){returndetail::apply_impl(std::forward(f),std::forw

c++ - forward<T>(a) 和 (T&&)(a) 有什么区别

templatevoidouter(T&&t){inner(forward(t));}templatevoidouter(T&&t){inner((T&&)(t));}有什么区别? 最佳答案 没有实际区别。std::forward(v)指定为static_cast(v).§20.2.3[forward]templateT&&forward(typenameremove_reference::type&t)noexcept;templateT&&forward(typenameremove_reference::type&&t)noe

c++ - 我什么时候应该 std::forward 一个函数调用?

我在EffectiveModernC++中看到的一段代码巧妙地实现了instrumentationrationale创建一个功能计时器:autotimeFuncInvocation=[](auto&&func,auto&&...params){starttimer;std::forward(func)(std::forward(params)...);stoptimerandrecordelapsedtime;};我的问题是关于std::forward(func)(...据我了解,我们实际上是将函数转换为其原始类型,但是为什么需要这样做?它看起来像一个简单的打电话就可以了。还有其他我们

c++ - 在 C++ 中将通用构造函数分配给成员变量时的 std::move 或 std::forward

考虑以下类foo1和foo2templatestructfoo1{Tt_;foo1(T&&t):t_{std::move(t)}{}};templatestructfoo2{foo1t_;foo2(T&&t):t_{std::forward(t)}{}};foo1的构造函数总是这样吗?表示初始化成员变量的正确方式T?即通过使用std::move.foo2的构造函数总是这样吗?表示初始化成员变量的正确方式foo1由于需要转发给foo1的构造函数?即通过使用std::forward.更新以下示例因foo1而失败使用std::move:templatefoo1make_foo1(T&&t){

c++ - 我应该在移动构造函数/赋值运算符中使用 std::move 还是 std::forward?

除非我错了,否则似乎两者都可以正常工作-是否有最佳实践理由更喜欢一个而不是另一个?例子:structA{A(){}A(constA&){std::cout(right.x)){std::cout输出:---BTest---A(A&&)B(B&&)---CTest---A(A&&)C(C&&)---DTest---A(constA&)D(D&&) 最佳答案 问题是:那些真的是类的移动构造函数/赋值运算符吗?或者它们只是从您的眼角看起来像那样?structX{X(X&&);//movector#1templateX(T&&);//per

c++ - 澄清 : Porting 32 to 64 bit

引自http://msdn.microsoft.com/en-us/library/windows/desktop/aa384242%28v=vs.85%29.aspxUseUINT_PTRandINT_PTRwhereappropriate(andifyouareuncertainwhethertheyarerequired,thereisnoharminusingthemjustincase).DonotcastyourpointerstothetypesULONG,LONG,INT,UINT,orDWORD.我可以安全地假设在现有32位代码行中将所有引用的DWORD转换为UNIT