C++ 什么是';常数';当在指向指针的指针rvalue const函数参数中使用时,是否执行此操作?

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

当使用指向右值常量的指针时,该值在函数中仍然可以修改。使用**&&const作为函数参数有什么用途吗。代码使用VC2013编译,用C++编译器NOV 2013编写。
编辑:我确实收到了警告“使用了错误的年代:引用上的限定符被忽略了”,但最好是不能完全编译。谢谢你的回答

> 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。