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)
我知道为什么我有错误(我试图转换一个结构),但我不明白为什么错误消息说明了它的作用。有人可以解释一下吗?
当编译器遇到 C风格的强制转换时,它会按照以下顺序尝试将其解释为一两个 C++ 风格的强制转换:
const_cast<new_type>(expression)static_cast<new_type>(expression)static_cast (with extensions) 其次是 const_castreinterpret_cast<new_type>(expression)reinterpret_cast 其次是 const_cast选择满足相应转换运算符要求的第一个选项,即使它无法编译。
在你的情况下,static_cast<sockaddr_in>(socket_addr)被选中。这是直接初始化,因此编译器会查找但没有找到const引用被转换对象的构造函数。
请注意,相同的转换在应用于指针时不会触发错误,因为语言在不同类型的指针之间具有内置转换。