C++当模板参数推导失败时

发布于 2024-10-29 19:52:39 字数 325 浏览 1 评论 0原文

为什么 C++ 无法确定我打算使用此语法创建 unique_ptr ? (a 之前已被声明为 unique_ptr

a = unique_ptr(new A());

必须包含 似乎非常多余。这适用于我使用的大多数函数模板,为什么 unique_ptr 不适用呢?

编辑: C++ 现在支持 make_unique,没有冗余。

Why can't C++ determine that I intend to create a unique_ptr<A> with this syntax? (a has previously been declared as unique_ptr<A>)

a = unique_ptr(new A());

It seems awfully redundant to have to include <A>. This works for most functions templates I use, why not unique_ptr?

EDIT: C++ now supports make_unique, with no redundancy.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风吹雪碎 2024-11-05 19:52:39

std::unique_ptr 是一个模板,而不是函数模板。参数推导仅发生在函数模板上,而不发生在模板上。

一个常用的技巧是编写一个函数模板来创建实例化类模板类型的对象,例如:

template <typename T>
std::unique_ptr<T> make_unique_ptr(T* ptr) 
{
    return std::unique_ptr<T>(ptr);
}

对于 std::unique_ptr,不过,我会避免这样做:a std::unique_ptr 对象应该直接获取动态分配对象的所有权,因此不需要这样做。您的代码应该写为:

std::unique_ptr<A> a(new A());

或者,如果 a 已经存在,则可以使用对 reset() 的调用:

a.reset(new A());

至于为什么类型推导不适用于实例化类模板,请考虑以下示例:

template <typename T>
struct X
{
    template <typename U> X(U) { }
};

无法从构造函数的调用中推导出 T。即使在“更简单”的情况下,存在带有 T 类型参数的构造函数,仍然可能会出现问题,因为构造函数可以重载。

std::unique_ptr is a class template, not a function template. Argument deduction only happens for function templates, not class templates.

A commonly used trick is to write a function template that creates an object of the instantiated class template type, for example:

template <typename T>
std::unique_ptr<T> make_unique_ptr(T* ptr) 
{
    return std::unique_ptr<T>(ptr);
}

For std::unique_ptr, though, I'd avoid doing this: a std::unique_ptr object should directly take ownership of the dynamically allocated object, so there should not be a need for this. Your code should either be written as:

std::unique_ptr<A> a(new A());

or, if a already exists, a call to reset() can be used:

a.reset(new A());

As for why type deduction won't work for instantiating a class template, consider the following example:

template <typename T>
struct X
{
    template <typename U> X(U) { }
};

There is no way that T could be deduced from an invocation of the constructor. Even in "simpler" cases where there is a constructor with a parameter of type T, there can still be trouble since constructors can be overloaded.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文