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

标签 c++ constructor member auto

C++ 能否以某种方式接受 'auto' 的这种用法?:

class A {
    public:
        A(): m_member(new auto)
        {
                [...]
        }

    private:
        BoringToTypeType *m_member;
}

目的是通过简化 A 的构造函数中的成员元素初始化来利用“auto”。实际上,代码会引发以下错误:

new expression for type 'auto' requires a constructor argument.

最佳答案

new auto(...)从内部传递的表达式推断结果指针的类型 (...) .在您的特定情况下,没有什么可以推断出来的。

您有几个选择:

  • m_member(new auto(x)) , 其中xBoringToTypeType 类型的表达式.

  • 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;
};

在这种情况下 T纯粹用于类型推导目的。 m_member必须重复两次,但您可以避免以这种方式输入其类型。

Simple tests on godbolt.org表明 newer不会产生任何额外开销。

关于c++ - C++ 构造函数中的 'new auto',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41442202/

相关文章:

c++ - 如何初始化对引用对象的引用是类成员?

c++ - Qt 插槽未被调用

C++将抽象类的派生对象添加到另一个没有悬挂指针的类中?

c++ - opencv背景减法得到颜色对象

c++ - 遍历树中的节点

java - "Parent c = new Child()"和 "Child c = new Child()"有什么区别?

java - 构造函数中的初始化 block

c++ - 构造函数在 C++ 中获取引用

c++ - 术语 C++ - 成员

python - 当仅修改一个成员时,如何更新 Pygame 矩形的所有成员变量?