unique_ptr作为模板参数

时间:2018-07-07 19:25:23

标签: c++ templates unique-ptr

为什么它会在VS 2017中编译?

fn main() {
    let cb: fn(u8) -> u8 = |x| x * 2;
}

使用编写的代码,输出为

#include <memory>
#include <iostream>

using namespace std;

struct x 
{
    x()  { cout << "x()" << endl; }
    ~x() { cout << "~x()" << endl; }
};

template <typename T>
void foo(T&& item)
{
    struct boo 
    {
        T item;

        boo(T&& t)
            : item(std::move(t))
        { }
    };

    new boo(std::move(item));
}

int main()
{
    std::unique_ptr<x> b(new x);

    foo(b); // I would expect that I should put std::move(b) here.
}

如果x() ~x() 行写为foo(b),那么输出就是

foo(std::move(b))

x() 的实例泄漏。我希望编写的代码是编译器错误,因为似乎x是在调用unique_ptr<x>时复制的?

1 个答案:

答案 0 :(得分:2)

使用clang时,它不会编译:https://wandbox.org/permlink/HCIDXxS1yqyq7uCb 它可与Visual Studio配合使用:http://rextester.com/GUR47187

所以它看起来像是VS中的错误。

它始终与movehttps://wandbox.org/permlink/u3N06Idr8ELo9SIp

一起使用

对于模板std::forward should be used而非std::move也是如此。

Here is code,了解VS如何解析模板:

void __cdecl foo<classstd::unique_ptr<struct x,struct std::default_delete<struct x> >&>(class std::unique_ptr<struct x,struct std::default_delete<struct x> > &)

因此,unique_ptr不会仅通过引用传递到unique_ptr