c++将单个变量作为引用和常量引用传递

c++ pass single variable as both reference and const reference

本文关键字:引用 常量 单个 变量 c++      更新时间:2023-10-16

假设有一个函数f接收两个变量,一个是引用,另一个是常量引用。

如果我同时传递一个变量作为两个参数,就会发生错误:

结果:

a: 6
b: 6

代码

void f(int &a,const int &b)
{
    a=a+1;
    std::cout<<"a: "<<a<<"n";
    std::cout<<"b: "<<b<<"n";
}
int main()
{
    int m=5;
    f(m,m);
    return 0;
}

这个问题有已知的名字吗?还有,有什么方法可以警告编译器要小心这一点吗?

此代码定义良好,没有问题。

代码const int &b表示:

  • b表示int
  • 表达式CCD_ 5可以不用于修改该CCD_

然而,通过其他方式修改CCD_ 7是完全可以的。例如,通过此处的a。编译f时,编译器必须考虑到ab可能都引用同一个对象。


一些编译器具有扩展,以指定函数参数(或其他变量)不应别名;例如,在MSVC++2015中,您可以写:

void f(int & __restrict a, const int & __restrict b)

然后编译器可以编译f,假设&a != &b,即它可能为您的代码输出6 5,这将是无声的未定义行为——编译器不需要诊断违反__restrict


当编写一个使用多个相同类型的引用或指针参数(不包括限定)或char的函数时,您必须注意,某些参数可能会使其他参数别名。您可以通过以下方式之一提交:

  • 编写代码,即使参数别名
  • 包括类似if ( &a == &b ) return;的支票
  • 使用__restrict并记录调用方有责任不使用别名

出现的一个常见情况是类的重载operator=。此函数需要支持有人编写x = x;,即*this可以对函数参数进行别名。有时人们会通过检查if ( &a == this ) return;来解决这个问题,有时他们会省略该检查,但会设计实现,使其即使相等也能工作。

这似乎"正常"工作。

您已经将函数定义为接受两个参数。声明第一个参数是为了指示引用的整数a可以在f()中更改,但不应更改b

这两个参数都是通过引用传递的,您违反了const的使用,因为更改的a也被引用为b

这种行为是我在没有优化的情况下所期望的。(实际存储为m的整数值在生成输出之前已递增。)但是,根据编译器和选项的不同,可能会对这种混叠进行不同的处理。在一般情况下,它的行为可能是不明确的。