如何在 std::pair 中转发不可移动对象

use*_*259 13 c++

std::pair当 a 包含不可移动的内容时,我无法弄清楚完美转发 a 的语法。

#include <mutex>
#include <list>
#include <utility>

struct A
{
    A(int x)
    {

    }
};

int main()
{
    std::list<std::pair<std::mutex, std::mutex>> v;
    v.emplace_back(); // ok

    std::list<std::pair<A, A>> v2;
    v2.emplace_back(3, 4); // ok

    std::list<std::pair<A, std::mutex>> v3;
    v3.emplace_back(3, std::forward<std::mutex>(std::mutex{})); // help
}
Run Code Online (Sandbox Code Playgroud)

use*_*522 15

您必须std::mutex从空参数列表就地构造。这可以使用构造函数来完成std::piecewise_construct,它允许您将两个元素的构造函数的参数作为std::tuples 转发。

// for std::forward_as_tuple
#include<tuple>

// ...

v3.emplace_back(std::piecewise_construct, std::forward_as_tuple(3), std::forward_as_tuple());
Run Code Online (Sandbox Code Playgroud)