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

时间:2011-11-09 15:47:25

标签: c++ pointers initialization local-variables built-in-types

内置类型的变量can be value-initialized like this

int var = int();

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

但是,如果我尝试为指针做类似的事情:

int* ptr = int*();

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

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

7 个答案:

答案 0 :(得分:9)

使用typedef为指针类型命名:

typedef int *ip;

ip ptr = ip();

同样的想法应该适用于需要多个词汇元素(单词)来定义类型名称的其他类型(例如unsigned longlong longunsigned long long *等)。

答案 1 :(得分:4)

  

如何使用Type()初始化Type *指针 - 就像语法一样?

你做不到。语法T()在5.2.3 / 1,2中定义(C ++ 03,C ++ 11 FDIS中的措辞略有不同)。特别是第二段规定:

  

表达式T(),其中T是非数组完整对象类型的简单类型说明符(7.1.5.2)或(可能是cv限定的)void类型,它创建指定类型的rvalue,这是值初始化(8.5);

这意味着int()将创建一个类型为int的rvalue和 value-initialize 它。现在的问题是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定义为:

  type-name:
    class-name
    enum-name
    typedef-name

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

答案 2 :(得分:3)

不需要使用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();

答案 3 :(得分:1)

只做

int* x = int();

它仍然为指针指定0,使其指向NULL地址,因为你使用默认值int默认值为0,无论如何。

实际上,它适用于所有类型:

double* y = int();

地址仍然是一个32位(或64位,取决于平台)整数,所以我认为如果你做= int(),它应该适用于所有类型。

答案 4 :(得分:1)

这是一种方式:

template <typename T>
T make_default()
{
    return T();
}

int main()
{
    int *p = make_default<int*>();
}

答案 5 :(得分:0)

不起作用的原因是因为指针没有构造函数。

语法

  

int ()

调用(理论上)

  

int::int ()

初始化变量。 (更有可能的是,编译器只是将变量归零,但这是因为它“知道”了整数。)

在c ++ 11中,您可以使用nullptr

  

int *ptr = nullptr;

否则,你几乎必须使用NULL:

  

int *ptr = NULL;

答案 6 :(得分:-1)

这是你如何做到的    int * ptr = new int;

Heap pointers