【问题标题】:What does 'const' do when used in a pointer to pointer rvalue const function argument?'const' 在指向指针右值 const 函数参数的指针中使用时会做什么?
【发布时间】:2014-05-29 19:57:09
【问题描述】:
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 

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

编辑:我确实收到警告“使用过时:引用的限定符被忽略”,但完全编译失败可能会更好。感谢您的回答!

【问题讨论】:

  • 允许改变值,但不能改变第一级指针。
  • 一个不错的编译器报告:'const' 限定符不能应用于'int**&&''
  • x 当然不是“指向右值 const 的指针”。如果它是合法的,那将类似于“指向指针的指针的 const 右值引用”——但 const 引用是无稽之谈。
  • 如果您发现这些答案之一有用,您应该考虑accepting one of them

标签: c++ visual-studio-2013


【解决方案1】:

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 允许编译该代码是错误的。

【讨论】:

  • VC2012 会在你提高警告级别时抱怨它:“使用过时错误:引用的限定符被忽略。”
【解决方案2】:

引用是别名,别名永远不会改变。所以,&const&&const 完全没有意义。它们在所有方面都与&&& 语义等价。

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

因此,使用const 限定引用完全没有意义。然后可以将您的函数重写为:

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

下一个标记是右值引用。它的目的是检测接收参数是否是匿名的。例如:

int **ppi = π

func(ppi);

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

值得注意的是,在func 内部,x 是一个左值引用,而不是rvalue-reference,因为在函数块内部,x 不再是一个匿名变量(它的名字只是x),无论其来源的“匿名性”如何。

【讨论】:

    【解决方案3】:

    指针和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)

    【讨论】:

    • 这不包括 OP 的情况。 OP 询问的是一个 const 右值引用到一个非const 指针到一个非const 指针到一个非const int
    • @Void 更新了我的回复。
    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多