我是C ++的新手,在尝试阅读这种原型时我感到困惑。
Visual Studio 2012中的“构建” (在本机C ++静态库中,而不是C ++ / CLI),尽管它没有不要使指针不变。 我注意到它发出了警告,我一开始并没有看到。
C ++ Visual Studio 2012
int intTest =3;
int intTest2 = 5;
const int const* pointerTest = &intTest;
pointerTest = &intTest2; //This works
const int* const pointerTest2 = &intTest;
pointerTest2 = &intTest2; //This doesn't build because the pointer is constant.
我意识到自己的错误,因为当我尝试在Linux(使用GCC 4.6.3 的Eclipse)中构建此代码时,它会抛出错误:
重复'const'
我错误地写了这个而不是 const MyClass * const ,但我没有注意到它,因为Visual Studio没有抛出错误。
为什么这种语法错了?我没有故意写,但我想明白。
答案 0 :(得分:2)
const
在左边装饰这个词,除非它是最左边的,然后它将术语装饰到右边。
使用上述规则重写您的声明
int const const* pointerTest = &intTest;
你应该写:
const int * const pointerTest = &intTest;
或坚持正确的const风格,不会感到困惑:
int const * const * const * const someEvilVariable = foo();
答案 1 :(得分:2)
在本声明中
const int const* pointerTest = &intTest;
限定符const只是重复。它相当于
const int * pointerTest = &intTest;
或
int const* pointerTest = &intTest;
这里有一个指针,用于定义常量数据。指针本身不是常量。
在本声明中
const int* const pointerTest2 = &intTest;
您将指针本身定义为常量。它可以仅在定义时初始化,并且可能不会更改。
答案 2 :(得分:1)
const MyClass *
和MyClass const *
都声明了一个指向const数据的指针,因此MyClass的任何一侧的const
都在做同样的事情,因此警告。
了解声明内容的一种技巧是从右到左阅读声明,例如
MyClass const * const pointerTest = &intTest; //a const pointer to const data of type MyClass
但是,您可以将限定符放在类名旁边,如下所示:
const MyClass * const pointerTest = &intTest; //a const pointer to data that is const.
其他可能的声明:
const MyClass * pointerTest = &intTest; //a non-const pointer to const data.
MyClass * const pointerTest = &intTest; //a const pointer to non-const data.
答案 3 :(得分:1)
如果const
位于type
(int
)之前或之后,则无关紧要。
因此
const int const* pointerTest
转换为
const int* pointerTest
因为const
两次无效。
重要的是const
和*
的顺序,所以在你的情况下:
- 首先是pointer
到const int
:
const int const* pointerTest = &intTest;
- 第二个是const pointer
到const int
:(因为const
位于*
之后)
const int* const pointerTest2 = &intTest;
因此您无法更改指针并收到错误。