从std :: size_t *到long unsigned int *的无效转换

ber*_*kie 4 c++

在树莓派上-arv7l我正在编译以下C ++程序

#include <iostream>

void fun(unsigned long int* i)
{
    std::cout << *i << std::endl;
}


int main()
{
    std::size_t i = 1;
    fun(&i);
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

对于上面的代码,我得到以下错误:

a.cpp: In function 'int main()':
a.cpp:12:9: error: invalid conversion from 'std::size_t* {aka unsigned int*}' to 'long unsigned int*' [-fpermissive]
     fun(&i);
         ^~
a.cpp:3:6: note:   initializing argument 1 of 'void fun(long unsigned int*)'
 void fun(unsigned long int* i)
      ^~~
Run Code Online (Sandbox Code Playgroud)

我了解在32位系统上,size_t是32位,可能与有所不同,unsigned long但仍应编译?

关于各种类型的大小:

sizeof(size_t): 4
sizeof(unsigned int): 4
sizeof(unsigned long int): 4

sizeof(size_t*): 4
sizeof(unsigned int*): 4
sizeof(unsigned long int*): 4
Run Code Online (Sandbox Code Playgroud)

系统:Linux turtlebot 4.14.79-v7 +#1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU / Linux

编译器:gcc-6.3

Nat*_*ica 12

我了解在32位系统上,size_t是32位,可能与unsigned long不同,但是仍然可以编译吗?

这是不正确的。您正确地认为类型具有相同的大小,但是大小不是使类型成为类型的原因。举例来说,我们有signed charunsigned charchar。这三个的大小均为1,但所有三个都是由标准命名的不同类型。

在您的情况下size_t*为a,unsigned int*并且由于与a的类型不同long unsigned int*,因此无法将其隐式转换为一个。