以下代码无法与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*
就是这种方法之一)? 最佳答案
您有几种选择。
您已经发现的一个是类型别名:
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/