繁体   English   中英

std::optional 默认构造函数不是 gcc 中的 constexpr?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM