- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 https://github.com/gdelugre/literal_ipaddr它说它是一个
C++17 constexpr implementation of inet_addr / inet_aton / inet_pton
当我这样做时:
auto ipSourceAddressTest = IPAddr::inet_pton<AF_INET>("127.0.0.1");
std::cout << "ipSourceAddressTest is " << ipSourceAddressTest.s_addr << std::endl;
这很好用。我得到十进制的 IP 地址。
但是:
std::string ipv4address;
//get ipv4address from world here
const unsigned int ipMaxSize = 200;
char ip[ipMaxSize];
std::copy(ipv4address.begin(), ipv4address.end(), ip);
auto ipSourceAddress = IPAddr::inet_pton<AF_INET>(ip);
std::cout << "ipSourceAddress is " << ipSourceAddress.s_addr << std::endl;
请记住 ipSourceAddress.s_addr
是 uint32_t
。我打印的值不是十进制的 IP,而是 4294967295
,即二进制的 111...111
。所以我认为它是在编译时而不是运行时获得它的值(value)。
如果我这样做
constexpr auto in_addr1 = IPAddr::inet_pton<AF_INET>(ip);
那么它的值将在编译时推导是可以理解的。但是我没有在我的变量声明中使用 constexpr
。 auto
是否意味着 constexpr
?
根据 https://en.cppreference.com/w/cpp/language/constexpr ,
A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline
那么为什么函数 inet_pton
在编译时获取它的值?
最佳答案
ipSourceAddress
在编译时没有得到它的值(就像不遵守规则一样)。
ip
的值在常量表达式中不可用,因为它未声明 constexpr
并且不符合常量表达式中左值到右值转换规则的其他异常(exception)之一。因此IPAddr::inet_pton<AF_INET>(ip)
不是常量表达式。
你可以通过制作ipSourceAddress
清楚地看到这一点constexpr
(auto
并不暗示)。
constexpr
在变量上需要在编译时初始化,因为初始化器不是常量表达式,所以它会失败。
参见 godbolt .
我不知道你是怎么得出不同结论的。
但是请注意,库似乎确实需要 char
传递给它的数组与它包含的字符串一样长(加上空终止符)。如果您将一个更长的数组交给它并输出您看到的值,它就会失败。
参见 godbolt .
看来作者打算只用字符串文字直接调用这些函数。
关于c++ - constexpr 函数在编译时获取值,即使我的变量不是 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59384084/
我是一名优秀的程序员,十分优秀!