以下代码无法与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*{}的方法吗(typedefint*就是这种方法之一)?

最佳答案

您有几种选择。

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

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

另一个是避免完全毫无意义的复制初始化:
int* a{};
PInt a{};

最好的方法是停止在这个笨蛋的工作上浪费时间,并以清晰的方式初始化指针:
int* a = nullptr;

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

简短的答案是,您不能“强制”编译器忽略C++的语法,而使用其他语法。

关于c++ - 统一初始化int * : how can it be forced?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43415533/

10-10 19:17