int *的统一初始化:如何强制?

时间:2017-04-14 16:30:14

标签: c++ c++11 pointers uniform-initialization

以下代码不能使用 clang ++ 3.8.0 g ++ 6.3.0 (编译器标志为-std=c++11 -Wall -Wextra -Werror -pedantic-errors)进行编译:

int main()
{
    int* a = int*{}; // doesn't compile
    //       ^^^^ can't be parsed as a type
    (void)a;

    using PInt = int*;

    PInt b = PInt{}; // compiles successfully
    //       ^^^^ is parsed as a type
    (void)b;
}

这是一种强制int*{}由编译器以正确方式解释的方法(typedef int*是这样的方法之一吗?)

3 个答案:

答案 0 :(得分:8)

您有几个选择。

您已经发现的一个是类型别名:

using PInt = int*;
PInt a = PInt{};

另一个是避免完全没有意义的复制初始化:

int* a{};
PInt a{};

最好是停止在这个傻瓜的差事上浪费时间,并以清晰的方式初始化你的指针:

int* a = nullptr;

当然,如果你的问题真的关于创建一个临时用于表达式而不是一个完整的声明(它不清楚),那对你没有帮助;但是你有一个简单的C风格(int*)nullptr可以玩。

简短的回答是你不能强迫"强迫"编译器忽略C ++的语法,而是使用其他语法。

答案 1 :(得分:0)

首先想到的是使用复合文字,如:

int* a = (int*){};

但正如所建议的那样,它是一个C99特性,作为扩展存在于gcc和clang c ++编译器中。

更好的方法是使用decltype(variable_name)作为一种类型进行统一初始化,如:

int* a = decltype(a){};

这个成功避免typedefusing条款并完成工作。

[live demo]

答案 2 :(得分:0)

template <typename T>
using identity = T;

int main()
{
    int* c = identity<int*>{};
    (void)c;
}