定义未初始化的引用 C++

Defining uninitilized reference c++

我有模板

T template<typename T>undefined_behavior(void)
{
    throw;
    return T{};
}
template<typename T>
struct UBHandler
{
    const bool valid;
    T value;
    (operator T)()
    {if(valid)return value;return undefined_behavior<T>();}
};

这在使用右值时有效,但在使用右值引用时失效,因为引用不是指针,不能凭空构造。

error: member ‘... ::value’ is uninitialized reference

在我删除所有依赖于此的代码并重新开始之前,有没有办法用某种空引用或神奇的 uncorn-union 来满足编译器的要求?

或者什么的。

欢迎未定义的行为。

这应该有效,因为 std::optional 存在并且 std::optional 有右值崇敬重载? 悲伤。也许不是,在阅读了之前提出的问题之后。但它是在 2014 年提出的 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3982.html 我不知道如何将其解释为解决方案。

std::optional 做了什么来摆脱我所缺少的东西? 悲伤。

我尝试阅读以下问题,但我没有任何想法。

重载引用类型并写成:

似乎微不足道
#include <stdexcept>

template<typename T>
struct UBHandler
{
    const bool valid;
    T value;
    operator T() {
        if (valid) return value;
        throw std::runtime_error("");
    }
};

template<typename T>
struct UBHandler<T&>
{
    T *const value;
    UBHandler() : value(nullptr) {}
    UBHandler(T& value) : value(&value) {}
    operator T() {
        if (value) return *value;
        throw std::runtime_error("");
    }
};

int main() {
    UBHandler<int&> a;
    a + 1;
    int b = 1;
    int &c = b;
    UBHandler<int&> d{c};
    d + 1;
}