c++ - 非模板类方法的完美转发

标签 c++ c++11

完美转发通常出现在模板类的上下文中。对于非模板类,是否值得制作例如构造函数是一个模板方法,因此它可以使用完美转发?类似下面的内容:

class Foo()
{
    public:
        template<typename T>
        Foo(T &&vec) : memberVec(std::forward<T>(vec)) {};

    private:
        std::vector memberVec;
};

优点基本相同,但是当我们知道真正的类类型时,有什么不同吗?这什么时候是好的做法,什么时候不是?

最佳答案

非显式单参数构造函数是转换构造函数。除非Foo应该是可转换的 vector (这可能是真的),你应该把它变成explicit .

一般来说,对于单参数 ctors,您需要禁用 SFINAE Foo匹配的类型。隐式 Foo&&Foo const&当你调用 Foo 时,ctors 是更糟糕的匹配用Foo& (比如,一个非常量左值)比你的模板构造函数。一个简单的class=std::enable_if_t<!std::is_same<std::decay_t<T>,Foo>>足够了。

将生成更多代码。

在这种情况下,std::vector<X>搬家便宜得离谱,所以

Foo( std::vector<X> vec ):memberVec(std::move(vec)) {}

99% 的效率和清晰度。

当您使用它时,通常会出现完美转发失败。上面的例子没有它们——我可以 Foo x({1,2,3})它通过了 {1,2,3}构建 vec .与 T&&它不会,因为它无法推断出什么 T是。

关于c++ - 非模板类方法的完美转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36363698/

相关文章:

c++ - 在 Poco 1.5.x 中重试锁定的 SQLite 数据库

C++:为什么这个 constexpr 模板函数会在 VS2017 中导致内部错误?(在 gcc 中是可以的)

c++ - 自动生成的 cpp 文件中未知大小的多维数组的 header 声明?

c++ - 使用模板输入双关语

c++ - 调用移动构造函数时感到困惑?

c++ - 成员函数声明的参数列表后面的单 & 是什么意思?

c++ - 如何在 Linux 上挂接 send()/recv() 函数?

c++ - 对类成员而不是 getter 的 Const 引用

c++ - gcc 4.7 中的错误?与否,我不确定所以我在这里问

c++ - 为什么 param_type 构造函数对于随机分布是显式的?