当前位置: 首页 > 知识库问答 >
问题:

从std::byte迭代器可视化接受std::string

潘文乐
2023-03-14
#include <vector>
#include <string>

int main()
{
    std::vector<std::byte> test(10);
    std::string str(test.begin(), test.end());
}

微软(修复了它)

我们已经在未来的版本中修复了这个问题。现在MSVC提供如下错误:错误C2664:'void std::basic_string,std::allocator>::push_back(const_elem)':无法用[_elem=char]将参数1从“std::byte”转换为“const_elem”

共有1个答案

曹茂材
2023-03-14

MSVS使用迭代器对的字符串构造函数如下所示

template<class _Iter,
    class = enable_if_t<_Is_iterator_v<_Iter>>>
    basic_string(_Iter _First, _Iter _Last, const _Alloc& _Al = _Alloc())
    : _Mybase(_Al)
    {   // construct from [_First, _Last) with optional allocator
    _Tidy_init();
    _Adl_verify_range(_First, _Last);
    _Construct(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Iter_cat_t<_Iter>());
    }

_construct最终调用

template<class _Iter>
    void _Construct(_Iter _First, const _Iter _Last, input_iterator_tag)
    {   // initialize from [_First, _Last), input iterators
    _TRY_BEGIN
    for (; _First != _Last; ++_First)
        {
        push_back(static_cast<_Elem>(*_First));
        }

    _CATCH_ALL
    _Tidy_deallocate();
    _RERAISE;
    _CATCH_END
    }

重要的位是push_back(static_cast<_elem>(*_first));。通常,您不能将std::byte直接分配给另一个类型,因为它是一个限定作用域的枚举,但是由于存在static_cast,您可以绕过这个问题。这就是为什么您能够使用一定范围的字节来初始化std::string

allocator_traits<A>::construct(m, p, args)

并且构造在[allocator.requirements]-表33中定义为

效果:在C处构造C类型的对象

Default::new((Void*)c)c(forward (args)...)

 类似资料:
  • 在“掌握C++17 STL”一书中,我看到iterator和const_iterator在一个类中实现,使用条件来减少代码重复 下面是我对简单数组类的实现(跳过数组类的大部分代码): 这段代码编译时没有错误,但iterator有点不可用: 给出错误: 我该如何使用那个迭代器呢?还是我应该从书上放弃这个想法呢?

  • 假设我有std::vector和两个线程。 第一个线程正在处理擦除函数,而第二个线程在for循环中 这种情况是线程安全的吗? 第二个线程会继续运行还是抛出异常?

  • 考虑一个大型内存容器。在这个简单的例子中 span允许我在内存上创建一个轻量级视图。现在,我只想打印跨度: 输出: 现在我想制作子集(这是实际上作为视图变得有用的地方)。我可以使用迭代器来指定我的范围并从调用这个构造函数(3) 但这行不通: C没有与参数列表匹配的构造函数实例参数类型为:(std::\u Vector\u iterator 有可能使用接受指针和大小的构造函数(2): 但这违背了迭代

  • 我想为客户数据结构提供一个视图,它有自己的迭代器。我编写了一个小程序来测试它,如下所示。如果我取消对begin()的注释,它就会工作。但是如果我使用DummyIter,那么我会得到一个编译错误。 在我的完整程序中,我实现了一个完整的迭代器,但为了简单起见,我把它缩小到了必要的函数。 我使用的是GCC 11.1.0。我在迭代器中缺少了什么使其符合范围?

  • 下面的代码显示了我要做的:

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var