问题标签 [std-variant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
200 浏览

c++ - 为什么将 int 分配给 std::variant失败?

在分配给变体时,我觉得我缺少一些关于 int 类型提升的明显内容。

在 gcc 版本 9.3.0(Ubuntu 9.3.0-11ubuntu0~18.04.1)上,使用 -std=c++17 编译,以下代码编译失败:

错误信息:

是否有任何魔法可以让这项工作按预期进行,而不需要在作业中进行显式转换?谢谢!

0 投票
1 回答
121 浏览

c++ - 具有不同函数类型值的 std::map

我想将 astd::map与某些类型的函数(某些特定的参数类型)一起用作可能的值。但是,以下(最小)示例无法编译。

为什么会这样,我怎样才能允许地图的值FunctionType<bool>FunctionType<int>可能的值?

错误信息:

0 投票
3 回答
236 浏览

c++ - 访问 std::variant 中的结构成员

我有一个 std::variant,它有两个不同的结构作为替代。现在我需要用另一种选择的数据填充它(我在运行时知道),但它必须以某种方式,可以单独在结构中写入元素。显然,这是行不通的:

还有另一种方法可以实现这一目标吗?如果我知道我想写的替代方案,也许一种方法可以告诉变体它具有哪种结构或类似的东西?

我能弄清楚的唯一方法是为变体的内存空间制作一个强制引用并使用它来写入它。问题是这没有使用变体的方法,因此不会自动设置索引。同样以相同的方式设置索引也很困难,因为索引的大小因不同的变体而异(有时是一个字节,有时是 8 个字节):

或者有没有办法找出索引的大小?

0 投票
4 回答
178 浏览

c++ - 如何过滤掉 std::variant 向量中某些数据类型的元素?

我有一个类型为orstd::vectorstd::variant元素。如果迭代元素的类型是 ,我想循环这个向量和一个额外的项目。但是,似乎不允许在运行时查询索引。我怎样才能做到这一点?intstd::set<int>insertstd::set<int>

错误信息:

0 投票
1 回答
65 浏览

c++ - 关于将指向 C++17 标准变体的指针传递给期望 const 引用的函数的不一致行为

在将指针传递给需要常量引用的函数时,我看到了一些奇怪的行为。显然,C++ 希望我在将指针传递给期望引用的函数之前取消引用指针。我正在寻找错误或警告,但除非满足某个对我没有任何意义的条件,否则我不会收到错误或警告。

指针和引用的类型是 C++ 17 标准变体(如下)。如果我的 C++17 变体在模板中包含布尔值(如下所示),那么 GCC8.3 可以很好地编译代码。但我有意想不到的运行时结果。

如果我从标准变体模板中删除布尔值,则代码不会按我预期的那样编译。为什么有区别?

编译并运行为上面的代码块:

从 StdVARIANT 中注释 'bool',并且:

为什么我不总是得到错误,而只是在 bool 被注释掉时?

0 投票
2 回答
71 浏览

c++ - 无法使用 initializer_list 调用带有变体参数的函数

我对使用 std::variant 不是很熟练,也不能完全理解所有构造函数的情况。

正如我可以推断出的,这里调用了构造函数,但不明白什么条件不满足。有人可以解释一下吗?

PS是否有一些文章或来源可以阅读更多信息和使用变体的示例?

0 投票
1 回答
84 浏览

c++ - 使用传递的 lambda 调用 std::visit

我有一个包含variant.

我想为该结构编写一个成员函数,该函数应该根据当前持有的类型变体运行代码。

但是,我在编译时遇到了问题。我不想使用更多的“模板恶作剧”,比如使用单独的结构来定义operator(T&),因为它更加污染了语法。这是一个例子:

我什至不知道编译器想从我这里得到什么: https ://godbolt.org/z/oM4584anf

0 投票
1 回答
164 浏览

c++ - 具有已删除特殊成员函数的自定义类型的 std::variant 的赋值运算符?

考虑:

MSVC 接受了它,而 GCC 和 Clang 以相同的错误消息拒绝了它

我应该信任哪个编译器?

0 投票
1 回答
351 浏览

c++ - 为什么 std::variant 实现对空类型的变体占用超过 1 个字节?

这主要是琐事问题,因为我怀疑我是否需要节省空间。

在玩Godbolt 时,我注意到 libstdc++ 和 libc++ 实现都std::variant需要超过 1 个字节来存储空结构的变体。

libstc++ 使用 2 个字节

libc++ 使用 8 个字节

我认为优化这个是不值得的,但我想知道是否还有其他原因。特别是标准措辞中是否std::variant存在阻止这种优化的内容。

0 投票
1 回答
74 浏览

c++ - 在构造过程中观察变体的状态

考虑以下代码:

使用 libstdc++(来自 GCC 11),这可以工作,但使用 libc++(来自 LLVM 12)和 MSVC,断言失败。

哪个标准库实现了正确的行为?在任何时候都不会抛出任何异常,而且我的类型完全是 noexcept,所以我希望“valueless_from_exception”永远不会是真的。

引用标准(https://timsong-cpp.github.io/cppwp/n4861/variant#status):

如果在类型更改分配或安置期间引发异常,则变体可能不保存值。

在这里,我显然不是那种情况。