c++ - unique_ptr 参数类型的模板参数推导指南?
问题描述
是否可以编写一个演绎指南,以便Simple
可以在没有模板参数的情况下声明一个实例?我已经尝试过,但无法获得正确的形式来提取std::unique_ptr
元素类型。
//------------------------------------------------------------------------------
template< class T >
class Simple
{
public:
Simple( std::unique_ptr< T >& u ) :
u_( u )
{}
private:
std::unique_ptr< T >& u_;
};
class MyThing
{};
int main()
{
std::unique_ptr< MyThing > upSimple;
Simple( upSimple ); // error C2955: 'Simple': use of class template requires template argument list
}
解决方案
是否可以编写一个推导指南,以便可以在没有模板参数的情况下声明 Simple 的实例?我已经尝试但无法获得正确的形式来提取 std::unique_ptr 元素类型。
问题是另一个。
隐式生成的推导指南完全能够为Simple
.
正如 Rakete1111 所指出的,这是一种“最令人头疼的解析”问题。
写作
Simple( upSimple );
您的意图是获取使用对象初始化的未命名临时对象的初始化类型Simple
(Simple<MyThing>
感谢新的 C++17 隐式生成的推导指南)upSimple
。
不幸的是,编译器(visual-c++,但与 g++ 和 clang++ 相同)将其解释为名称和类型的新变量的声明(注意声明 C++ 变量的括号是多余的但完全合法;int (i);
您声明了一个i
type的变量) .int
upSimple
Simple
这给出了一个错误,因为
(1)upSimple
在前一行中定义,所以我们重新声明upSimple
(2) 隐式生成的推导指南无法在没有构造函数参数的情况下推T
导出Simple
.
为了避免这种歧义,并获得Simple<MyThing>
对象的初始化,您可以将值保存在变量中
auto s = Simple(upSimple);
或也与
Simple s(upSimple);
所以编译器不能再将该行解释为变量的声明upSimple
。
如果你真的想要一个未命名的临时对象,你可以使用统一初始化(你可以使用大括号代替圆括号)
//.....V..........V
Simple { upSimple };
不能解释为变量声明。
而且,是的:强制使用新的 C++17 标准(通过/std:c++17
或-std=c++17
特定编译器所需的任何一个)也是有用的。
推荐阅读
- wordpress - Woocommerce 产品价格倍增至 365 天或每年
- django - 将令牌作为字段包含在 Django+SimpleJwt 的用户模型中会更好吗?
- html - img 标签上的 SVG 的维度为零
- typescript - 如何使用打字稿在 vue3 设置脚本中导入类型?
- java - 通配符的类型擦除
- html - 如何分别在左右浮动的 2 个元素之间居中文本?
- php - 更新帖子时如何创建新文件并保存到根目录?
- javascript - 如何使用 fastapi 在同一个域上同时提供我的网站和我的 API?
- redis - 使用 Redis Pub/Sub 的基于推送的实现
- javascript - 使用 Apple 身份验证时如何在 Firebase 中设置 displayName?