小编J. *_*Doe的帖子

我的循环缓冲区出了什么问题

最近我接受了面试,并被要求实施循环缓冲类.它不需要使用任何容器(包括STL).

我的代码如下:

template<class T>
class CircularFifo
{
    T *    _data;
    size_t _size;

    size_t _read;  // last readen elem
    size_t _write; // next write index

    CircularFifo(CircularFifo const &) = delete;
    CircularFifo & operator=(CircularFifo const &) = delete;
    CircularFifo(CircularFifo &&) = delete;
    CircularFifo & operator=(CircularFifo &&) = delete;

public:
    explicit inline
    CircularFifo(size_t size = 2048)
        : _data(new T[size])
        , _size(size)
        , _read(-1)
        , _write(0)
    {
        if (0 == _size)
        {
            throw std::runtime_error("too empty buffer");
        }

        if (1 == _size)
        {
            throw std::runtime_error("too …
Run Code Online (Sandbox Code Playgroud)

c++

12
推荐指数
2
解决办法
1287
查看次数

在将变量用作emplace_back的参数后使用变量是否可以?

可能是一个蹩脚的问题,但我一直没有找到全面的答案.

参数std::vector::emplace_back是r值引用.据我所知,在通过r值引用传递对象后使用对象是不安全的.我的意思是:

std::string str("hello world");
std::string str2(std::move(str)); // string::string(string &&);
cout << str;                      // unsafe, str was moved to str2
Run Code Online (Sandbox Code Playgroud)

那么,下面的例子会发生什么?

std::vector<std::string> array;
std::string str("hello world");   // what if add 'const' qualifier here?
array.emplace_back(str);          // template <class... Args>
                                  // void emplace_back (Args&&... args);
std::cout << str;                 // safe or not? str was moved or copied?
Run Code Online (Sandbox Code Playgroud)

我真的很困惑.我的测试表明,str之后使用是安全的emplace_back,但是我的(破碎?)逻辑告诉我str移动了,之后不应该使用它.

PS.对不起,我的英语不好 :)

c++ language-lawyer c++11

2
推荐指数
1
解决办法
377
查看次数

标签 统计

c++ ×2

c++11 ×1

language-lawyer ×1