定义未初始化的引用 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 做了什么来摆脱我所缺少的东西? 悲伤。
我尝试阅读以下问题,但我没有任何想法。
- std::optional specialization for reference types
- std::optional<T> call by reference
重载引用类型并写成:
似乎微不足道
#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;
}
我有模板
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 做了什么来摆脱我所缺少的东西? 悲伤。
我尝试阅读以下问题,但我没有任何想法。
- std::optional specialization for reference types
- std::optional<T> call by reference
重载引用类型并写成:
似乎微不足道#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;
}