什么' const'当在指针中使用指针rvalue const函数参数?

时间:2014-05-29 19:57:09

标签: c++ visual-studio-2013

void func(int **&&const x) 
{   
    *(*x) = 32; 

}

void main()
{
    int *pi = new int{ 64 };

    printf("x : %d\n", *pi);

    func(&pi);

    printf("x : %d\n", *pi);
}


Outputs: 
x : 64 
x : 32 

当使用指向rvalue const的指针时,该值仍可在函数内修改。是否有使用**&& const作为函数参数的目的。代码是使用VC2013和C ++ Compiler 2013年11月编译的。

编辑:我确实收到警告"使用的时间错误:引用的限定符被忽略"但是完全无法编译可能会更好。谢谢你的答案!

3 个答案:

答案 0 :(得分:3)

gcc 4.8.2不认为它是有效的代码:

// snippet of your code
void func(int **&& const x)
{
    *(*x) = 32;

}

...和编译......

$ g++ -fsyntax-only -Wall -pedantic -std=c++11 foo.cpp
foo.cpp:2:26: error: ‘const’ qualifiers cannot be applied to ‘int**&&’
 void func(int **&& const x)
                          ^

我将假设VC 2013允许编译代码是错误的。

答案 1 :(得分:1)

引用是别名,别名永远不会改变。因此,&const&&const毫无意义。它们在所有问题上在语义上等同于&&&

因此不允许使用这种结构(可能是为了简化元编程)。不仅适用于int**&&const,也适用于int& constint&& const

因此,使用const对引用进行限定完全没有任何意义。您的功能可以重写为:

void func(int **&& x) 
{   
    *(*x) = 32; 
}

下一个标记是rvalue-reference。其目的是检测接收参数是否是匿名的。例如:

int **ppi = π

func(ppi);

不起作用,ppi不是匿名变量(它是一个名字),但是&pi它是(它只是一个地址,所以,一个pure rvalue)。

值得注意的是,在func内,x是左值引用,而不是rvalue-reference,因为在功能块内x不再是一个匿名变量(它的名字只是x),而不管是匿名变量"它的起源。

答案 2 :(得分:0)

指针和const的使用可能令人困惑。这是一个解释。

int i;
int * ip1 = &i;

ip1可以更改为指向另一个对象。 *ip1可以更改为另一个值。

int const* ip2 = &i;

ip2可以更改为指向另一个对象。 *ip2无法更改为具有其他值。

int * const ip3 = &i;

ip3无法更改为指向另一个对象。 *ip3可以更改为另一个值。

int const* const ip4 = &i;

ip4无法更改为指向另一个对象。 *ip4无法更改为具有其他值。

现在,回答你的问题,

void func(int **&&const x)

不是C++中的有效代码。它在C++11中也无效。

假设你的意思,

void func(int **&const x)

xconst对指向int的指针的引用。这意味着,您无法更改x指向的内容,但您可以更改*x。您也可以更改*(*x)