最近我接受了面试,并被要求实施循环缓冲类.它不需要使用任何容器(包括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) 可能是一个蹩脚的问题,但我一直没有找到全面的答案.
参数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.对不起,我的英语不好 :)