内置类型的变量可以像这样进行值初始化:
int var = int();
这样我就得到了默认值,int
而无需在我的代码中硬编码零。
但是,如果我尝试为指针做类似的事情:
int* ptr = int*();
编译器(Visual C++ 10)拒绝编译(说type int unexpected
)。
如何以类似的方式对指针进行值初始化?
内置类型的变量可以像这样进行值初始化:
int var = int();
这样我就得到了默认值,int
而无需在我的代码中硬编码零。
但是,如果我尝试为指针做类似的事情:
int* ptr = int*();
编译器(Visual C++ 10)拒绝编译(说type int unexpected
)。
如何以类似的方式对指针进行值初始化?
使用 typedef 为您的指针类型命名:
typedef int *ip;
ip ptr = ip();
同样的想法也适用于需要多个词法元素(单词)来定义类型名称的其他类型(例如,、、、unsigned long
等long long
)unsigned long long *
。
如何使用类似 Type() 的语法对 Type* 指针进行值初始化?
你不能。语法T()
在 5.2.3/1,2 中定义(C++03,C++11 FDIS 中的措辞略有不同)。特别是第二段指出:
表达式 T(),其中 T 是非数组完整对象类型或(可能是 cv 限定的)void 类型的简单类型说明符 (7.1.5.2),创建指定类型的右值,即 value -初始化(8.5);
这意味着int()
, 将创建一个 int 类型的右值并对其进行值初始化。现在的问题是这int*
不是一个简单的类型说明符,而是一个详细的类型说明符。语法中simple-type-specifier的定义是:
simple-type-specifier:
::opt nested-name-specifieropt type-name
::opt nested-name-specifier template template-id
char
wchar_t
bool
short
int
long
signed
unsigned
float
double
void
类型名称定义为:
type-name:
class-name
enum-name
typedef-name
这就是使提议的解决方案起作用的原因。typedef 的创建(直接或通过模板)创建了一个类型名称(第三种类型),可以用作简单类型说明符(第一种类型)。
不需要使用typedef
(但 C++11 独有),这在处理多种指针类型时很有用:
template<typename T>
using alias = T;
然后alias<int*>
就是int*
,这样就可以了int* p = alias<int*>()
。
C++03 的类似解决方案,使用身份元函数:
template<typename T>
struct identity {
typedef T type;
};
int* p = identity<int*>::type();
做就是了
int* x = int();
它仍然将 0 分配给指针,使其指向 NULL 地址,因为您将其默认为 int 的默认值,无论如何都是 0。
实际上,它适用于所有类型:
double* y = int();
该地址仍然是一个 32 位(或 64 位,取决于平台)整数,所以我认为如果你使用 = int(),它应该适用于所有类型。
这是一种方法:
template <typename T>
T make_default()
{
return T();
}
int main()
{
int *p = make_default<int*>();
}
不起作用的原因是指针没有构造函数。
语法
int ()
电话(理论上)
int::int ()
它初始化变量。(更有可能的是,编译器只是将变量归零,但那是因为它“知道”整数)。
在 c++11 中,您可以使用 nullptr
int *ptr = nullptr;
否则,您几乎必须使用 NULL:
int *ptr = NULL;
这就是你的做法 int* ptr = new int;