首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::variant的显式转换运算符与get< T >()函数

std::variant的显式转换运算符与get< T >()函数
EN

Stack Overflow用户
提问于 2016-09-19 18:17:27
回答 2查看 511关注 0票数 3

除了(或者甚至代替) get< T >()自由函数(draft的第568页)之外,让std::variant类的一部分成为显式转换(到替代)操作符重载设置有什么缺点?

代码语言:javascript
复制
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 >()),但我认为更自然的方法是通过简单地转换为包含备用值,而不是对变体实例应用某些函数专门化。

EN

回答 2

Stack Overflow用户

发布于 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的引用的情况都会导致错误:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2017-03-30 14:44:09

我不提出它的主要原因是:

  • optional没有
  • optional具有explicit operator bool() (has_value()或not?)
  • variant和optional应尽可能保持一致。

但如果论据正确,这一点在未来的修订中肯定会有所改变。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39570686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档