【发布时间】:2021-04-24 16:10:54
【问题描述】:
我在 C++ 中使用 constexpr 并注意到我希望理解的奇怪行为。考虑标准 5.19 部分中的这段代码。
constexpr int f1(int k) {
constexpr int x = k; // error: x is not initialized by a
// constant expression because lifetime of k
// began outside the initializer of x
return x;
}
由于错误状态,k 的生命周期在 x 的初始化程序之外开始,因此我们不能确定 x 将是一个常量表达式。
这里是相同功能的另一个版本。
constexpr int f1(int k) {
return k;
}
这个非常好用。所以问题是为什么k 的生命周期也开始于返回值的初始化程序之外,或者这是因为 RVO,从技术上讲,如果只是遵循标准,这也应该是一个错误?
还有另一个问题,这个问题实际上来自于这个问题。我试图写constexpr IPv4 类。为此,我使用了带有std::string_view 的构造函数。所以我能够在编译时使用 gcc 10.3 和 -std=c++20
constexpr IPv4 myIP{"192.168.0.0"};
constexpr size_t count = myIP.countOfDots(); // calls std::count which is constexpr in C++20
现在我想验证 IP 是否正确,所以我需要检查点数是否等于 3,我可以在这里轻松地做到这一点
if constexpr (count != 3)
问题是如何将它组织成一些函数,这也将允许我对任何给定 IP 进行编译时间检查,基本上我想要这样的东西
constexpr bool validateIP(const IPv4& ip);
和上面的例子一样,我不能只在那个函数中有这个
constexpr size_t count = ip.countOfDots();
那么有没有可能按照我想要的方式去做呢?
【问题讨论】:
-
"现在我想验证 IP 是否正确,所以我需要检查点数是否等于 3,我可以在这里轻松完成" 为什么你在这里使用
if constexpr?您是否试图丢弃某些语句,因为如果count不是 3,它们将不适合实例化?否则,这样做没有意义,你的意思是if。 -
从你的评论和回答我明白我真的误解了
constexpr函数的意思,现在明白了,谢谢你的帮助:)