我constexpr在 C++中玩弄并注意到我希望理解的奇怪行为。考虑来自标准 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;
}
Run Code Online (Sandbox Code Playgroud)
作为错误状态,生命周期k在 的初始值设定项之外开始x,因此我们不能确定这x 将是一个常量表达式。
这里是相同功能的另一个版本。
constexpr int f1(int k) {
return k;
}
Run Code Online (Sandbox Code Playgroud)
这个很好用,很好用。所以问题是,为什么这里的生命周期也k开始于返回值的初始值设定项之外,或者不是,或者这是因为 RVO 并且从技术上讲,如果只是遵循标准,这也应该是一个错误?
还有另一个问题,这个问题实际上是从这个问题产生的。我正在尝试编写constexprIPv4 类。为此,我使用了带有std::string_view. 所以我能够在编译时使用 gcc 10.3 和 -std=c++20
constexpr IPv4 myIP{"192.168.0.0"};
constexpr size_t …Run Code Online (Sandbox Code Playgroud)