除了(或者甚至代替) get< T >()
自由函数(draft的第568页)之外,让std::variant
类的一部分成为显式转换(到替代)操作符重载设置有什么缺点?
template<class... Types>
class variant
{
template<class T>
explicit operator const T& () const&;
template<class T>
explicit operator T& () &;
template<class T>
explicit operator const T&& () const &&;
template<class T>
explicit operator T&& () &&;
};
在某些情况下是不安全的吗?为什么我们需要自由的get()
函数(即“类型”版本,而不是“索引”版本),当variant公开一个值语义时(引用自草案):
变量对象保存和管理值的生命周期。
使一个变量显式地转换为alternative,但仍然隐式地从一个alternative构造,这还不够吗?
我知道,接口的一致性是一件好事(我记得我们需要get< I >()
和get< T >()
),但我认为更自然的方法是通过简单地转换为包含备用值,而不是对变体实例应用某些函数专门化。
发布于 2016-09-19 19:09:56
我能想到一些缺点:
std::variant
可以保存cv void
,但返回cv void&
和cv void&&
的转换函数将是非法的,并且从不调用到cv void
的转换函数std::variant<std::monostate, std::any> v; std::any a{v};
可以保存也可以从其构造的类型,例如:std::variant<std::monostate, std::any> v; std::any a{v};
-在这种情况下应该发生什么?此外,目前可以获取返回T
的函数,将其转换为返回std::variant<T, U>
的函数,并期望编译器检测所有需要更改代码的情况;使用到T
的转换函数,任何复制或绑定对T
的引用的情况都会导致错误:
int f();
int i{f()}; // OK
// f() changes to:
std::variant<int, std::string> f();
int i{f()}; // can now throw std::bad_variant_access
发布于 2017-03-30 14:44:09
我不提出它的主要原因是:
explicit operator bool()
(has_value()
或not?)但如果论据正确,这一点在未来的修订中肯定会有所改变。
https://stackoverflow.com/questions/39570686
复制相似问题