constexpr 函数在编译时获取值,即使我的变量不是 constexpr
constexpr function gets value at compile time even though my variable is not constexpr
我正在尝试使用 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_addr
是uint32_t
。我打印的值不是十进制的IP,而是4294967295
111...111
二进制。所以我认为它在编译时而不是运行时获得它的价值。
如果我这样做
constexpr auto in_addr1 = IPAddr::inet_pton<AF_INET>(ip);
那么可以理解的是,它的值将在编译时推导出来。但是我没有在变量声明中使用constexpr
。auto
是否意味着constexpr
?
根据 https://en.cppreference.com/w/cpp/language/constexpr,
函数或静态成员变量中使用的 constexpr 说明符 (自 C++17( 声明意味着内联
那么为什么函数inet_pton
在编译时获得其值呢?
ipSourceAddress
在编译时不会获得其值(好像规则不适用(。
ip
的值在常量表达式中不可用,因为它没有声明为constexpr
,并且不符合常量表达式中左值到右值转换规则的其他例外之一。因此,IPAddr::inet_pton<AF_INET>(ip)
不是一个常量表达式。
您可以通过制作ipSourceAddress
constexpr
(auto
没有暗示(清楚地看到这一点。
对变量constexpr
需要在编译时进行初始化,并且由于初始值设定项不是常量表达式,因此它将失败。
见神霹雳。
我不知道你是如何得出不同结论的。
但请注意,该库似乎确实要求传递给它的char
数组与它包含的字符串(加上 null 终止符(一样长。如果您给它一个更长的数组并输出您看到的值,它会失败。
见神霹雳。
似乎作者打算仅使用字符串文字直接调用这些函数。
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 当我的阵列太大时出现分段错误
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么我的 constexpr 对象在我的函数中不是 constexpr?
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 为什么 constexpr 假设我的方法就是 const
- 如果我的班级是字面的班级,那么将我的类的对象声明为constexpr是多余的
- 为什么我的编译器显示有关我的 constexpr 函数的此错误?
- 如何使我的C 编译器发出constexpr值(例如警告?)
- 为什么我不能递增简单 constexpr 函数的参数?
- 为什么我的 constexpr 函数不能返回 lambda?