lac*_*cal 3 c++ constructor member auto
C++能以某种方式接受'auto'的使用吗?:
class A {
public:
A(): m_member(new auto)
{
[...]
}
private:
BoringToTypeType *m_member;
}
Run Code Online (Sandbox Code Playgroud)
目的是通过简化A的构造函数中的成员元素初始化来利用'auto'.实际上,代码引发了以下错误:
new expression for type 'auto' requires a constructor argument.
Run Code Online (Sandbox Code Playgroud)
new auto(...)从内部传递的表达式中推导出结果指针的类型(...).在您的特定情况下,没有什么可以推断出来的.
你有几个选择:
m_member(new auto(x)),where x是表达式BoringToTypeType.
m_member(new std::remove_pointer_t<decltype(m_member)>),这肯定不是一个改进BoringToTypeType.
如果您不介意定义其他辅助函数,可以使用以下替代解决方案:
template <typename T, typename... TArgs>
auto newer(T*, TArgs&&... args)
{
return new T(std::forward<TArgs>(args)...);
}
class A
{
public:
A(): m_member(newer(m_member, 12))
{
}
private:
int *m_member;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下T,纯粹用于类型扣除目的.m_member必须重复两次,但你不能这样输入它的类型.
对godbolt.org的简单测试表明,newer不会产生任何额外的开销.
如果您不想重复该类型名称,可以添加私有别名:
class A {
using mem_t = BoringToTypeType;
public:
A(): m_member(new mem_t)
{
[...]
}
private:
mem_t *m_member;
}
Run Code Online (Sandbox Code Playgroud)
当然,在实际代码中std::unique_ptr,在大多数情况下,您应该使用或类似而不是原始指针.
| 归档时间: |
|
| 查看次数: |
863 次 |
| 最近记录: |