gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:49:48 25 4
gpt4 key购买 nike

假设有一个函数 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
  • 表达式 b 不能用于修改 int

然而,通过其他方式修改 int 是完全没问题的。例如,通过此处的 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; 来解决这个问题,有时他们会忽略该检查但设计实现,即使它们相等,它仍然可以工作。

关于c++将单个变量作为引用和常量引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36659767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com