Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中正确使用完美转发+;? 我想知道下面是否正确使用C++中的完全转发(下面的解释):_C++_Perfect Forwarding - Fatal编程技术网

在C+中正确使用完美转发+;? 我想知道下面是否正确使用C++中的完全转发(下面的解释):

在C+中正确使用完美转发+;? 我想知道下面是否正确使用C++中的完全转发(下面的解释):,c++,perfect-forwarding,C++,Perfect Forwarding,是否首选?任何可以从中构造的B,都可以在示例代码中使用一个参数 这不是一件坏事 如果B的构造函数采用int,则可以将int作为第一个参数传递。它不是创建一个临时的B然后将其移动到您的结构中,而是直接从int在您的结构中构造B 如果你真的,真的想要你所描述的,你可以用三种方法来实施它: // copy: A( B const& b,const C& c ) : _b{ b },_c{ c } { } // move: A( B&& b,const C& c

是否首选?

任何可以从中构造的
B
,都可以在示例代码中使用一个参数

这不是一件坏事

如果
B
的构造函数采用
int
,则可以将
int
作为第一个参数传递。它不是创建一个临时的
B
然后将其移动到您的结构中,而是直接从
int
在您的结构中构造
B

如果你真的,真的想要你所描述的,你可以用三种方法来实施它:

// copy:
A( B const& b,const C& c ) : _b{ b },_c{ c } { }
// move:
A( B&& b,const C& c ) : _b{ std::move( b ) },_c{ c } { }

这就是成语“如果你想要速度,就按值传递”


在这里,从参数到
B
的隐式转换也被阻止,除非调用方显式转换。

是的,这是正确的。如果不喜欢,请定义两个构造函数。
A( B& b,const C& c ) : _b{ b },_c{ c } { }
A( B&& b,const C& c ) : _b{ std::move( b ) },_c{ c } { }
// copy:
A( B const& b,const C& c ) : _b{ b },_c{ c } { }
// move:
A( B&& b,const C& c ) : _b{ std::move( b ) },_c{ c } { }
template <typename T, typename=std::enable_if<
  std::is_same<
    typename std::decay<T>::type,
    B
  >::value
>::type> A( T&& b,const C& c ) : _b{ std::forward<T>( b ) },_c{ c } { }
A( B b, const C& c ): _b(std::move(b)), _c(std::move(c)) {}