0

如果我可以在创建新对象时为构造函数参数提供一个参数包,并且我不提供任何构造函数参数,那么结果将是:new T(); 如果它没有用户提供的构造函数,它将对对象进行值初始化。我该如何阻止这种情况发生?

template <typename T>
struct Foo
{
    template <typename ... ConstructorArgs>
    static void create(ConstructorArgs ... constructorArgs)
    {
        T* ptr = new T(constructorArgs ...);
        T* ptr2 = new T;
        std::cout << *ptr; // It seems it value-initialized (zero-initialized) it
        std::cout << *ptr2; // Default initialized it

    }

};
int main()
{
    Foo<int>::create();
}
4

1 回答 1

1

这与 constexpr sizeof... (ConstructorArgs) 一起使用,但我也想知道是否有更好的方法。

template <typename T>
struct Foo
{
    template <typename ... ConstructorArgs>
    static void create(ConstructorArgs ... constructorArgs)
    {
        T* ptr;
        if constexpr (sizeof ... (ConstructorArgs) == 0)
            ptr = new T;
        else
            ptr = new T(constructorArgs ...);
    }

};
int main()
{
    Foo<int>::create(); // Default initializes
    Foo<int>::create(0); // Value/Zero initialized

}

它适用于 new 和 Placement new,以及左值堆栈变量,但不是临时的,即 T{ },因为如果 T 没有用户定义的构造函数,这些大括号将值初始化。

于 2021-04-08T05:15:36.440 回答