为什么const MyClass const *无效?

时间:2014-01-02 14:18:14

标签: c++ visual-studio-2012

我是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没有抛出错误。

为什么这种语法错了?我没有故意写,但我想明白。

4 个答案:

答案 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位于typeint)之前或之后,则无关紧要。

因此

const int const* pointerTest

转换为

const int* pointerTest

因为const两次无效。

重要的是const*的顺序,所以在你的情况下:

- 首先是pointerconst int

const int const* pointerTest = &intTest;

- 第二个是const pointerconst int :(因为const位于*之后)

const int* const pointerTest2 = &intTest;

因此您无法更改指针并收到错误。