如何使用Type() - 类似语法来初始化Type*指针?

sha*_*oth 14 c++ pointers initialization local-variables built-in-types

内置类型的变量可以像这样进行值初始化:

int var = int();
Run Code Online (Sandbox Code Playgroud)

这样我就可以获得默认值,int而无需在代码中硬编码零.

但是,如果我尝试为指针执行类似的操作:

int* ptr = int*();
Run Code Online (Sandbox Code Playgroud)

编译器(Visual C++ 10)拒绝编译(说type int unexpected).

如何以类似的方式对指针进行值初始化?

Jer*_*fin 9

使用typedef为指针类型命名:

typedef int *ip;

ip ptr = ip();
Run Code Online (Sandbox Code Playgroud)

同样的想法应该适用于其他类型的需要不止一个词汇元素(字)来定义类型的名称(例如unsigned long,long long,unsigned long long *等).


Dav*_*eas 4

如何使用类似 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:
    ::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
Run Code Online (Sandbox Code Playgroud)

类型名称定义为:

  type-name:
    class-name
    enum-name
    typedef-name
Run Code Online (Sandbox Code Playgroud)

这就是所提出的解决方案发挥作用的原因。typedef 的创建(直接或通过模板)创建了一个可以用作简单类型说明符(第一种类型)的类型名称(第三种类型)。