问题描述
如果我可以在创建新对象时为构造函数参数设置一个参数包并且我不提供任何构造函数参数,那么结果将是: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();
}
解决方法
这是使用 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 没有用户定义的构造函数,这些大括号将进行值初始化。