在 lambda 中完美捕获完美的转发器(通用参考)
Perfectly capturing a perfect forwarder (universal reference) in a lambda
所以我有一个完美的转发器,我想在 lambda 中适当地捕获它,以便复制 R 值,并通过引用捕获 L 值。然而,简单地使用 std::forward 并不能完成这项工作,如下代码所示:
#include<iostream>
class testClass
{
public:
testClass() = default;
testClass( const testClass & other ) { std::cout << "COPY C" << std::endl; }
testClass & operator=(const testClass & other ) { std::cout << "COPY A" << std::endl; }
};
template< class T>
void testFunc(T && t)
{ [test = std::forward<T>(t)](){}(); }
int main()
{
testClass x;
std::cout << "PLEASE NO COPY" << std::endl;
testFunc(x);
std::cout << "DONE" << std::endl;
std::cout << "COPY HERE" << std::endl;
testFunc(testClass());
std::cout << "DONE" << std::endl;
}
用
编译
g++ -std=c++14 main.cpp
产生输出
PLEASE NO COPY
COPY C
DONE
COPY HERE
COPY C
DONE
在一个完美的世界中,我希望 "COPY C" 只出现在右值的情况下,而不是左值的情况下。
我的解决方法是使用为 L- 和 R- 值重载的辅助函数,但我想知道是否有更好的方法。
干杯!
您可以使用以下内容:
[test = std::conditional_t<
std::is_lvalue_reference<T>::value,
std::reference_wrapper<std::remove_reference_t<T>>,
T>{std::forward<T>(t)}]
但提供辅助函数似乎更具可读性
所以我有一个完美的转发器,我想在 lambda 中适当地捕获它,以便复制 R 值,并通过引用捕获 L 值。然而,简单地使用 std::forward 并不能完成这项工作,如下代码所示:
#include<iostream>
class testClass
{
public:
testClass() = default;
testClass( const testClass & other ) { std::cout << "COPY C" << std::endl; }
testClass & operator=(const testClass & other ) { std::cout << "COPY A" << std::endl; }
};
template< class T>
void testFunc(T && t)
{ [test = std::forward<T>(t)](){}(); }
int main()
{
testClass x;
std::cout << "PLEASE NO COPY" << std::endl;
testFunc(x);
std::cout << "DONE" << std::endl;
std::cout << "COPY HERE" << std::endl;
testFunc(testClass());
std::cout << "DONE" << std::endl;
}
用
编译g++ -std=c++14 main.cpp
产生输出
PLEASE NO COPY
COPY C
DONE
COPY HERE
COPY C
DONE
在一个完美的世界中,我希望 "COPY C" 只出现在右值的情况下,而不是左值的情况下。
我的解决方法是使用为 L- 和 R- 值重载的辅助函数,但我想知道是否有更好的方法。
干杯!
您可以使用以下内容:
[test = std::conditional_t<
std::is_lvalue_reference<T>::value,
std::reference_wrapper<std::remove_reference_t<T>>,
T>{std::forward<T>(t)}]
但提供辅助函数似乎更具可读性