在C ++中,如何将uint16_t变量传递给带有无符号int&参数的函数?

时间:2018-07-05 12:04:40

标签: c++

我有一个变量uint16_t a=35;和一个函数

UINT Read(unsigned int& nVal);

如何以a的身份将Read()传递给unsigned int&

如果我这样通过

Read(a); 

我收到以下错误:

  

无法将参数1从'uint16_t'转换为'unsigned int&

4 个答案:

答案 0 :(得分:6)

您将需要将值复制到(命名的)临时变量中,调用该函数,然后再复制临时副本(可能在检查溢出后)。

uint16_t a = 35;
...
unsigned int temp = a;
const unsigned int result = Read(temp);
// check for overflow here
a = temp;

当然,如果您可以将a的定义更改为unsigned int,那将更加简单(但是我认为由于其他原因这是不可能的)。

答案 1 :(得分:3)

由于Read引用了非常量unsigned int,因此您不能将其临时传递。您必须在某处创建实际的unsigned int才能绑定到该引用:

unsigned int au16 = a;
Read(au16);
a = au16; // don't forget to impact on a the changes made on au16

答案 2 :(得分:3)

其他答案都给出了解决方案,但我想我会更深入地研究为什么,您首先会看到错误。

发生了什么事,对于您的编译器来说uint16_tunsigned int是不同的类型(它很可能实现32位的unsigned int)和{{1 }}可转换为uint16_t,因此函数调用中隐藏了一个隐式强制转换。

此强制转换生成临时,即一个无名实体,然后将其作为参数传递给函数。 由于该函数采用 non-const 引用,因此该函数可能会修改引用的变量。由于引用的变量是 not unsigned int,而不是临时变量,因此发生的任何更改都将(无形地)丢失。

为防止这种情况,C ++禁止您将临时变量(或更正确地说是 a ,其中rvalue只是一种类型)作为非const引用传递

请注意,对于temporary引用,不存在意外丢失修改的问题,因为您无法修改引用的值。因此,C ++禁止您在其中传递const

答案 3 :(得分:-1)

最简单的答案是你不会。

创建类型为unsigned int的变量,将值复制到该变量,然后将该变量传递给函数。如果需要,在调用函数后,将值复制回去。

uint16_t a = 16;
unsigned temp_a = a;
Read(temp_a);

// check value of temp_a if needed

a = temp_a;

如果编译器提供的auint16_t实际上是同一类型,则尝试直接传递unsigned可能可行。但是,这不是标准所保证的,因此并非所有编译器都可以保证。 uint16_tunsigned是不同类型的地方,直接传递a(如果可以强制编译器接受)将产生不确定的行为。