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

Con*_*tor 4 c++ pointers uniform-initialization c++11

以下代码不使用clang ++ 3.8.0g ++ 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;
}
Run Code Online (Sandbox Code Playgroud)

它是一种强制int*{}编译器以正确的方式在这里解释(typedef荷兰国际集团的int*是这样的一种方式)?

Lig*_*ica 8

你有几个选择.

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

using PInt = int*;
PInt a = PInt{};
Run Code Online (Sandbox Code Playgroud)

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

int* a{};
PInt a{};
Run Code Online (Sandbox Code Playgroud)

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

int* a = nullptr;
Run Code Online (Sandbox Code Playgroud)

当然,如果您的问题实际上是关于在表达式中创建临时用语而不是完整声明(这不清楚),那对您没有帮助; 但是你有一个简单的C风格(int*)nullptr.

简而言之,不是你不能"强制"编译器忽略C++的语法而是使用其他语法.