C++构造函数中的'new auto'

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)

Vit*_*meo 7

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不会产生任何额外的开销.


Tar*_*ama 6

如果您不想重复该类型名称,可以添加私有别名:

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,在大多数情况下,您应该使用或类似而不是原始指针.