【问题标题】:Defining uninitilized reference c++定义未初始化的引用 C++
【发布时间】:2021-03-24 01:22:21
【问题描述】:

我有一个模板

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 来满足编译器 - 联合的事情?

什么的。

欢迎使用未定义的行为。

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

std::optional 做了什么来摆脱我错过的这个问题? 悲伤。

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

【问题讨论】:

  • 好吧,鉴于显示的代码似乎格式不正确(并且没有自尊的 C++ 编译器愿意在这里做任何事情),任何回复都将纯粹是猜测,因为您的确切情况尚不清楚。
  • @SamVarshavchik 如果我知道如何为 null 类型编写默认构造函数,那将不是问题。 UBHandler{false,?} 我可以传递什么作为参数?我还没有找到任何东西。也许是一个全局无效的东西?
  • 这与任何构造函数无关。诸如缺少分号和引用未声明的类名之类的东西往往会在此处提问时引发麻烦。
  • is there a way to satisfy the compiler with some kind of null reference or magic uncorn—union thing? 所以使用指针?它实际上是一个引用,通过成为 nullopt 可能是无效的。
  • @KamilCuk 我在搜索中看到了 nullopt 并跳过了它。感谢您的关注。

标签: c++ undefined-behavior rvalue-reference


【解决方案1】:

重载引用类型并写入似乎微不足道:

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2019-01-09
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2014-03-18
    • 2011-01-19
    • 2012-03-24
    相关资源
    最近更新 更多