C++ std::可选默认构造函数在gcc中不是constexpr?

C++ std::可选默认构造函数在gcc中不是constexpr?,c++,gcc,initialization,constexpr,stdoptional,C++,Gcc,Initialization,Constexpr,Stdoptional,我有以下代码来测试我的constexpr可构造的惰性类: #包括 模板 班级懒惰 { 使用初始值设定项_t=t(*)(); std::可选m_val=std::nullopt; 初始化器\u t m\u初始化器; 公众: constexpr Lazy(initializer\u t initializer=initializer\u t{[]{return t{};}})noexcept :m_初始值设定项{initializer}{} T&运算符*() { 如果(!m_val.has_val

我有以下代码来测试我的constexpr可构造的惰性类:

#包括
模板
班级懒惰
{
使用初始值设定项_t=t(*)();
std::可选m_val=std::nullopt;
初始化器\u t m\u初始化器;
公众:
constexpr Lazy(initializer\u t initializer=initializer\u t{[]{return t{};}})noexcept
:m_初始值设定项{initializer}{}
T&运算符*()
{
如果(!m_val.has_value()){
m_val=m_初始值设定项();
}
返回*m_val;
}
constexpr T*运算符->(){return&(**this);}
};
#包括
结构A{
int f(){return 10;}
~A()
{

std::cout这与您的问题有些无关,但是是什么阻止您使用Lazy=std::optional来执行
模板呢?我一直采用这种方法来定义一个Lazy初始化变量。我不想在(!a)a.emplace(…)时编写Lazy构造
每次我使用
a
的函数时。我想在第一次使用
a
时进行一些固定的初始化(通常带有很长的参数)。我还想对不可移动的对象进行一些后期初始化(为了简单起见,我从上面的代码中删除了这些对象)我真的认为这是一个gcc错误,因为为
m_val
使用初始值设定项列表也解决了这个问题。我不相信这是一个错误。我不知道如何要求编译器使用外部存储对变量进行常量初始化,因为常量初始化需要在编译时进行,而外部变量的实际初始化可能会重新启动翻译单元中的ide在编译时不可见。@cplusplusrat:
Lazy a{[]{return a{};};
可以在编译时进行常量初始化,然后动态初始化
int val=a->f();