C++ 什么是';常数';当在指向指针的指针rvalue const函数参数中使用时,是否执行此操作?
当使用指向右值常量的指针时,该值在函数中仍然可以修改。使用**&&const作为函数参数有什么用途吗。代码使用VC2013编译,用C++编译器NOV 2013编写。C++ 什么是';常数';当在指向指针的指针rvalue const函数参数中使用时,是否执行此操作?,c++,visual-studio-2013,C++,Visual Studio 2013,当使用指向右值常量的指针时,该值在函数中仍然可以修改。使用**&&const作为函数参数有什么用途吗。代码使用VC2013编译,用C++编译器NOV 2013编写。 编辑:我确实收到了警告“使用了错误的年代:引用上的限定符被忽略了”,但最好是不能完全编译。谢谢你的回答> PGC4.4.2没有考虑有效代码: void func(int **&&const x) { *(*x) = 32; } void main() { int *pi = new in
编辑:我确实收到了警告“使用了错误的年代:引用上的限定符被忽略了”,但最好是不能完全编译。谢谢你的回答> PGC4.4.2没有考虑有效代码:
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
。。。而编译
// snippet of your code
void func(int **&& const x)
{
*(*x) = 32;
}
<>我假设VC 2013允许代码编译。 < P> GCC 4.82.没有考虑它的有效代码:
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
。。。而编译
// snippet of your code
void func(int **&& const x)
{
*(*x) = 32;
}
我假设VC 2013允许代码编译是错误的。使用指针和
const
可能会让人困惑。这里有一个解释
$ 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)
^
ip1
可以更改为指向另一个对象<代码>*ip1可以更改为具有另一个值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
ip2
可以更改为指向另一个对象<代码>*ip2不能更改为具有其他值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
ip3
无法更改为指向另一个对象<代码>*ip3可以更改为具有另一个值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
ip4
无法更改为指向另一个对象<代码>*ip4不能更改为具有其他值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
现在,说到你的问题
int const* const ip4 = &i;
不是C++
中的有效代码。它在C++11
中也无效
假设你的意思是
void func(int **&&const x)
x
是const
对指向int的指针的引用。这意味着,您不能更改x
指向的内容,但可以更改*x
。您还可以更改*(*x)
指针和常量的使用可能会造成混淆。这里有一个解释
$ 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)
^
ip1
可以更改为指向另一个对象<代码>*ip1
可以更改为具有另一个值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
ip2
可以更改为指向另一个对象<代码>*ip2不能更改为具有其他值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
ip3
无法更改为指向另一个对象<代码>*ip3可以更改为具有另一个值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
ip4
无法更改为指向另一个对象<代码>*ip4不能更改为具有其他值
int i;
int * ip1 = &i;
int const* ip2 = &i;
int * const ip3 = &i;
现在,说到你的问题
int const* const ip4 = &i;
不是C++
中的有效代码。它在C++11
中也无效
假设你的意思是
void func(int **&&const x)
x
是const
对指向int的指针的引用。这意味着,您不能更改x
指向的内容,但可以更改*x
。您还可以更改*(*x)
引用是别名,并且别名永远不会更改。因此,&const
和&const
毫无意义。它们在语义上与&
和&
完全相同
因此,这种构造是不允许的(可能是为了简化元编程)。不仅适用于int**&&const
,也适用于int&const
或int&&const
因此,用const
限定引用毫无意义。您的函数可以重写为:
void func(int **&const x)
下一个标记是右值引用。它的目的是检测接收参数是否匿名。例如:
void func(int **&& x)
{
*(*x) = 32;
}
不起作用,ppi
不是匿名变量(它是一个名称),而是&pi
它是(它只是一个地址,所以是一个纯右值)
需要注意的是,在func
内部,x
是一个左值引用,而不是rvalue引用,因为在函数块内部,x
不再是一个匿名变量(其名称只是x
),而不管其来源的“匿名性”。引用是别名,别名永远不会改变。因此,&const
和&const
毫无意义。它们在语义上与&
和&
完全相同
因此,这种构造是不允许的(可能是为了简化元编程)。不仅适用于int**&&const
,也适用于int&const
或int&&const
因此,用const
限定引用毫无意义。您的函数可以重写为:
void func(int **&const x)
下一个标记是右值引用。它的目的是检测接收参数是否匿名。例如:
void func(int **&& x)
{
*(*x) = 32;
}
不起作用,ppi
不是匿名变量(它是一个名称),而是&pi
它是(它只是一个地址,所以是一个纯右值)
需要注意的是,在func
内部,x
是一个左值引用,而不是rvalue引用
,因为在函数块内部,x
不再是一个匿名变量(其名称只是x
),而不管其来源是什么“匿名性”。它允许更改值,但不要更改第一级指针。一个好的编译器会报告:“const”限定符不能应用于“int**&”x
肯定不是“指向右值常量指针的指针”。如果它是合法的,它会像一个“指向指针指针的const r参考引用”——但是一个const引用是无稽之谈。如果你发现其中一个答案是有用的,你应该考虑。它允许改变这个值,但不要更改第一级指针。一个好的编译器会报告:“const”限定符不能应用于“int**&”x
肯定不是“指向右值常量指针的指针”。如果它是合法的,它会像一个“指向指针指针的const r参考引用”——但是一个const引用是无稽之谈。如果你发现其中一个答案是有用的,你应该考虑。如果你把警告级别提高了,VC2012会抱怨它:“ANAC。