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月编译的。
编辑:我确实收到警告"使用的时间错误:引用的限定符被忽略"但是完全无法编译可能会更好。谢谢你的答案!
答案 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& const
或int&& 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)
x
是const
对指向int的指针的引用。这意味着,您无法更改x
指向的内容,但您可以更改*x
。您也可以更改*(*x)
。