constexpr 函数在编译时获取值,即使我的变量不是 constexpr

constexpr function gets value at compile time even though my variable is not constexpr

本文关键字:constexpr 我的 变量 函数 编译 获取      更新时间:2023-10-16

我正在尝试使用 https://github.com/gdelugre/literal_ipaddr 它说它是一个

C++17 inet_addr/inet_aton/inet_pton的constexpr 实现

当我这样做时:

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_addruint32_t。我打印的值不是十进制的IP,而是4294967295111...111二进制。所以我认为它在编译时而不是运行时获得它的价值。

如果我这样做

constexpr auto in_addr1 = IPAddr::inet_pton<AF_INET>(ip);

那么可以理解的是,它的值将在编译时推导出来。但是我没有在变量声明中使用constexprauto是否意味着constexpr

根据 https://en.cppreference.com/w/cpp/language/constexpr,

函数或静态成员变量中使用的 constexpr 说明符 (自 C++17( 声明意味着内联

那么为什么函数inet_pton在编译时获得其值呢?

ipSourceAddress

在编译时不会获得其值(好像规则不适用(。

ip的值在常量表达式中不可用,因为它没有声明为constexpr,并且不符合常量表达式中左值到右值转换规则的其他例外之一。因此,IPAddr::inet_pton<AF_INET>(ip)不是一个常量表达式。

您可以通过制作ipSourceAddressconstexpr(auto没有暗示(清楚地看到这一点。

对变量constexpr需要在编译时进行初始化,并且由于初始值设定项不是常量表达式,因此它将失败。

见神霹雳。

我不知道你是如何得出不同结论的。


但请注意,该库似乎确实要求传递给它的char数组与它包含的字符串(加上 null 终止符(一样长。如果您给它一个更长的数组并输出您看到的值,它会失败。

见神霹雳。

似乎作者打算仅使用字符串文字直接调用这些函数。