首页 \ 问答 \ 函数只接受非常量左值(Having a function only accept non-const lvalues)

函数只接受非常量左值(Having a function only accept non-const lvalues)

我有一个函数,它将第一个向量排序为两个向量作为排序条件。 它的签名是

template<typename A, typename B>
void sort(A&& X, B&& Y)
{
  ..
}

问题是通用引用会允许像这样的无意义的情况

sort(vector<int>{ 2,1,3 }, vector<int>{ 3,1,2 });

之后右值将被销毁(废话)。

明确询问左值是不起作用的

template<typename A, typename B>
void sort(A& X, B& Y) ... // (*)

sort(vector<int>{2,1,3}, vector<int>{3,1,2});

由于某种原因上面的编译(我认为只允许const值左右绑定到rvalues并延长它们的生命周期?)。

如果我将const添加到左值引用,那么函数将不再能够修改矢量并对它们进行排序。


我的问题是:

1)为什么在标有// (*)的示例中,我可以将rvalue绑定到一个甚至不是const的左值? 为什么要像int& r = 20; 不允许? 有什么不同?

2)我该如何解决我的问题,即让函数接受左值而不是临时值? (如果可能的话,当然)

很明显,我可以使用任何可用的C ++版本


I have a function which sorts two vectors with the first of them as ordering criterion. Its signature is

template<typename A, typename B>
void sort(A&& X, B&& Y)
{
  ..
}

The problem is that universal references would allow nonsense cases like

sort(vector<int>{ 2,1,3 }, vector<int>{ 3,1,2 });

where an rvalue will be destroyed afterwards (nonsense).

Asking explicitly for a lvalue doesn't work since

template<typename A, typename B>
void sort(A& X, B& Y) ... // (*)

sort(vector<int>{2,1,3}, vector<int>{3,1,2});

for some reason the above compiles (I thought only const lvalues were allowed to bind to rvalues and to prolong their lifetime?).

If I add const to the lvalue reference then the function will no longer be able to modify the vectors and sort them.


My questions are:

1) Why in the example marked with // (*) can I bind a rvalue to a lvalue that is not even const ? Why instead something like int& r = 20; isn't allowed? What's the difference?

2) How can I solve my issue i.e. having the function accept only lvalues and not rvalue temporaries? (If it's possible, of course)

Obviously I'm allowed to use any C++ version available


原文:https://stackoverflow.com/questions/32720767
更新时间:2022-02-12 13:02

最满意答案

由于$out会将文档发送到存储引擎,因此MMAP存储引擎可以使用填充以允许自然文档增长,因此可能会与文档/ bson对象大小相关联。

从汇总中删除$ out并添加此代码段将显示文档大小(您可以添加任何其他字段以获取更多诊断数据)。 当我们遇到文档适合两个其他文档之间的差距的情况时,它将被添加到那里 - 所以订单将被改变 - >这意味着$ out将保持服务器顺序,但是存储引擎可以为此添加噪声。

db.coll.aggregate([pipeline]).forEach(function(doc)
{
    print(" _id: "+ doc._id + "\t\t size: " + Object.bsonsize(doc)  )          
})

聊天后 - 并建议从MMAP切换到WT - 查询成功运行!


As $out sends documents to storage engine, then there could be a shift in order connected with document/bson object size, as MMAP storage engine uses padding to allow natural document growth.

removing $out from aggregate and adding this snippet will display documents size (you could add any other field to get more diagnostic data). When we will have a situation that documents fits in a gap between two other documents, then it will be added there - so order will be changed-> that means $out will preserver order, but storage engine can add a noise to that.

db.coll.aggregate([pipeline]).forEach(function(doc)
{
    print(" _id: "+ doc._id + "\t\t size: " + Object.bsonsize(doc)  )          
})

Solution

after a chat - and recommendation to switch from MMAP to WT -query was ran with success!

相关问答

更多

相关文章

更多

最新问答

更多
  • 获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
  • 如何通过引用返回对象?(How is returning an object by reference possible?)
  • 矩阵如何存储在内存中?(How are matrices stored in memory?)
  • 每个请求的Java新会话?(Java New Session For Each Request?)
  • css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)
  • 无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)
  • xcode语法颜色编码解释?(xcode syntax color coding explained?)
  • 在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)
  • 从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)
  • 从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))
  • 西安哪有PLC可控制编程的培训
  • 在Entity Framework中选择基类(Select base class in Entity Framework)
  • 在Android中出现错误“数据集和渲染器应该不为null,并且应该具有相同数量的系列”(Error “Dataset and renderer should be not null and should have the same number of series” in Android)
  • 电脑二级VF有什么用
  • Datamapper Ruby如何添加Hook方法(Datamapper Ruby How to add Hook Method)
  • 金华英语角.
  • 手机软件如何制作
  • 用于Android webview中图像保存的上下文菜单(Context Menu for Image Saving in an Android webview)
  • 注意:未定义的偏移量:PHP(Notice: Undefined offset: PHP)
  • 如何读R中的大数据集[复制](How to read large dataset in R [duplicate])
  • Unity 5 Heighmap与地形宽度/地形长度的分辨率关系?(Unity 5 Heighmap Resolution relationship to terrain width / terrain length?)
  • 如何通知PipedOutputStream线程写入最后一个字节的PipedInputStream线程?(How to notify PipedInputStream thread that PipedOutputStream thread has written last byte?)
  • python的访问器方法有哪些
  • DeviceNetworkInformation:哪个是哪个?(DeviceNetworkInformation: Which is which?)
  • 在Ruby中对组合进行排序(Sorting a combination in Ruby)
  • 网站开发的流程?
  • 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
  • 条带格式类型格式模式编号无法正常工作(Stripes format type format pattern number not working properly)
  • 透明度错误IE11(Transparency bug IE11)
  • linux的基本操作命令。。。