C ++:强制执行一个函数,使它不能接受任何按值传递的参数

时间:2017-02-27 07:02:32

标签: c++ function c++11 c++14

在C ++中,如何定义和声明一个只能接受任何通过值传递的参数的函数。 如下所示应返回错误:

#include <iostream>
using namespace std;

// function declaration
void swap(int &x, int &y);

int main () {
   // local variable declaration:
   int a = 100;
   int b = 200;

   cout << "Before swap, value of a :" << a << endl;
   cout << "Before swap, value of b :" << b << endl;


   swap(a, b); //This call MUST NOT be valid.


   int &x = a;
   int &y = b;
   swap(x,y); // This one should be valid.

   cout << "After swap, value of a :" << a << endl;
   cout << "After swap, value of b :" << b << endl;

   return 0;
}

void swap(int &x, int &y) {
   int temp;
   temp = x; /* save the value at address x */
   x = y;    /* put y into x */
   y = temp; /* put x into y */

   return;
}
swap(a, b)中的

参数按值传递。我希望它在这样做时返回错误。

更新

我在接受采访时被问到这个问题。定义一个在按值调用时返回错误的方法。

与上面swap中的a函数一样,b<asp:HiddenField ID="HiddenField1" runat="server" EnableViewState="true"/> 中的函数调用必须是引用。

1 个答案:

答案 0 :(得分:3)

int a{};
int& b{a};

然后你不能以制作

的方式声明或定义函数foo
foo(b);

编译时

foo(a);

无法编译/工作。

如果foo被声明为foo(int& c),则在调用foo时,编译器会将引用c绑定到对象a - 无论您是否通过ab,因为引用c可以绑定到int类型的任何非常量非易失性左值。

ab范围内,从C ++开始,两者都是左值,因此对foo的调用应该没有区别,因为这是引用的内容:它们只是原始对象的某种“命名别名”。

定义函数swap(int&, int&)已经阻止了“按值调用”。 术语“按值调用”与“按引用调用”是指函数参数的属性,而不是传递对象的属性。