【发布时间】:2019-08-10 17:47:27
【问题描述】:
似乎编译器应该能够捕捉到 std::variant 没有迭代器方法的事实,但似乎我的代码编译没有问题(即使我为变体),但它在运行时崩溃(理所当然)。有人能解释一下为什么这段代码会编译吗?
注意:这不会阻止进度,因为现在我正在使用 std::visit,但很高兴知道为什么要编译。
我尝试过使用不同的变体模式,它们都可以编译。请参阅代码示例。您可以将其弹出到 cppreferences 或 Godbolt 中,它应该使用 C++17 标志或更高版本进行编译
#include <variant>
#include <string>
#include <cassert>
#include <iostream>
#include <list>
#include <map>
template<typename K, typename V>
//using var_maps = std::variant<std::map<K,V>, std::multimap<K,V> >;
//using var_maps = std::variant<std::list<int>, std::list<float> >;
using var_maps = std::variant<int, float>;
template <typename K, typename V>
void flat( const var_maps<K,V>& vmap)
{
//for(auto bIter = vmap.bexxxgin(), eIter = vmap.end(); bIter != eIter;
for(auto bIter = vmap.begin(), eIter = vmap.end(); bIter != eIter;
bIter = vmap.upper_bound( bIter->first ) )
{
}
}
我最初的案例是使用地图,但它可以有效地与任何东西一起编译。此外,我可以将 begin() 随机替换为任何其他单词,它仍然可以编译。我知道正确的方法是访问。我不可避免地试图拥有一个处理地图和多地图的函数并将其转换为另一种数据结构。
谢谢!
【问题讨论】:
标签: c++ std-variant