![](/img/trans.png)
[英]std::experimental::optional<T> implementation: Constexpr constructor confusion
[英]std::optional default constructor not being constexpr in gcc?
我有以下代码来测试我的 constexpr 可构造惰性类:
https:\/\/godbolt.org\/z\/rMLCiL<\/a>
#include <optional>
template <class T>
class Lazy
{
using initializer_t = T (*)();
std::optional<T> m_val = std::nullopt;
initializer_t m_initializer;
public:
constexpr Lazy(initializer_t initializer = initializer_t{[] { return T{}; }}) noexcept
: m_initializer{initializer} {}
T& operator*()
{
if (!m_val.has_value()) {
m_val = m_initializer();
}
return *m_val;
}
constexpr T* operator->() { return &(**this); }
};
#include <iostream>
struct A {
int f() { return 10; }
~A()
{
std::cout << "Goodbye A " << (void*)this << std::endl;
}
};
extern Lazy<A> a;
int val = a->f();
Lazy<A> a{[] { return A{}; }};
int main()
{
std::cout << val << std::endl;
}
这是 gcc 中的错误,还是我遗漏了什么?
<\/blockquote>是的,可以验证这个错误(程序执行期间的分段错误)在 GCC 9.4 之前仍然可以重现,并且程序从 GCC 10.1 开始运行良好(这意味着错误已修复)。 演示: https<\/a> : \/\/gcc.godbolt.org\/z\/osWa1no9Y<\/a>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.