这是代码:
{{1}}
为什么p1设置为x的值,但p2不设?
是因为p2不能仅仅通过查看r来保证x是常数吗? 或者引用此错误的引用还有其他细微之处吗?
答案 0 :(得分:3)
第三行应该引发错误。它不在VS2015中,因为编译器或标准中存在错误,具体取决于应用的标准。其他编译器会发出有关此行的错误消息。
在C ++ 11之前,任何求值为0的整数常量表达式都被视为空指针常量,因此第一行等同于 {
"compilerOptions": {
"outDir": "./built/",
"sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es5",
"types" : ["jquery", "lodash", "moment"]
},
"files": [
"./src/require-config.ts",
"./src/form.ts"
]
}
,它不不要让p1指向x 。
从C ++ 14开始,情况就不再如此了。粗略地说,只有文字零和const int* p1 = NULL;
是有效的空指针常量。
在两者之间,也就是说,在C ++ 11中,标准实际上允许将值为零的常量表达式视为空指针常量。这被视为标准中的缺陷。它是在C ++ 14中修复的。一些编译器(gcc,clang)选择立即修复缺陷并报告错误,即使在C ++ 11模式下也是如此。 VS2015没有。
第四行在任何版本的C ++中都不会有效,因为nullptr
的类型是引用,而不是整数。
答案 1 :(得分:-1)
指针代表值的地址,因此要初始化指针,您应使用“address-of”运算符:&
const int *p1 = &x;
const int *p2 = &r;
您可以设置指向0
的指针(这不是PC上的有效地址),因为这与将其设置为NULL
的情况相同。