为什么它会在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>
时复制的?
答案 0 :(得分:2)
使用clang时,它不会编译:https://wandbox.org/permlink/HCIDXxS1yqyq7uCb 它可与Visual Studio配合使用:http://rextester.com/GUR47187
所以它看起来像是VS中的错误。
它始终与move
:https://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
。