尝试在 C++ 中转换结构时出现奇怪的错误消息

Ed *_*ing 5 c++ struct casting error-messaging

在 Linux 上使用 C++,我只是愚蠢地写了这个:

struct in_addr ip_addr = ((struct sockaddr_in)socket_addr).sin_addr;
Run Code Online (Sandbox Code Playgroud)

而不是预期的:

struct in_addr ip_addr = ((struct sockaddr_in*)&socket_addr)->sin_addr;
Run Code Online (Sandbox Code Playgroud)

给我这个错误:

"error: no matching function for call to ‘sockaddr_in::sockaddr_in(sockaddr&)"
Run Code Online (Sandbox Code Playgroud)

我知道为什么我有错误(我试图转换一个结构),但我不明白为什么错误消息说明了它的作用。有人可以解释一下吗?

das*_*ght 5

当编译器遇到 C风格的强制转换时,它会按照以下顺序尝试将其解释为一两个 C++ 风格的强制转换

  • const_cast<new_type>(expression)
  • static_cast<new_type>(expression)
  • static_cast (with extensions) 其次是 const_cast
  • reinterpret_cast<new_type>(expression)
  • reinterpret_cast 其次是 const_cast

选择满足相应转换运算符要求的第一个选项,即使它无法编译。

在你的情况下,static_cast<sockaddr_in>(socket_addr)被选中。这是直接初始化,因此编译器会查找但没有找到const引用被转换对象的构造函数。

请注意,相同的转换在应用于指针时不会触发错误,因为语言在不同类型的指针之间具有内置转换。