Skip to content

Latest commit

 

History

History
63 lines (49 loc) · 1.32 KB

File metadata and controls

63 lines (49 loc) · 1.32 KB

条款24:区分万能引用和右值引用

T&& 被称作万能引用。万能引用会在两种场景下出现,一种是函数模板形参:

template<typename T>
void f(T&& param);

第二个场景是 auto 声明:

auto&& var2 = var1;

这两个场景的共同之处,在于它们都涉及类型推导。

如果没有涉及到类型推导,那么它就是右值引用。且该形式被限定的很死,必须形如 T&&

template<typename T>
void f(std::vector<T>&& param); // 右值引用
template<typename T>
void f(const T&& param);    // 右值引用

类模板的模板参数不涉及类型推导,所以不是万能引用:

template<class T, class Allocator = allocator<T>>
class vector {
public:
    void push_back(T&& x);  // 右值引用
    ...
};

作为对比,成员函数 emplace_back 却会发生类型推导:

template<class T, class Allocator = allocator<T>>
class vector {
public:
    template <class... Args>
    void emplace_back(Args&&... args);  // 万能引用
    ...
};

C++14中lambda表达式允许使用 auto&& 类型形参:

auto timeFuncInvocation = 
    [](auto&& func, auto&&... params)
    {
        std::forward<decltype(func)>(func)(
            std::forward<decltype(params)>(params)...
        );
    };