C++ make_tuple将类型T传递为T&&;,应将T作为模板参数时

C++ make_tuple将类型T传递为T&&;,应将T作为模板参数时,c++,tuples,point-cloud-library,C++,Tuples,Point Cloud Library,我试图创建一个tuple类型的tuple,pcl::visualization::PointCloudColorHandler>但当我将相应类型的参数传递到std::make_tuple时,它表示作为pcl::PointCloud传递的参数实际上是pcl::PointCloud&&,如果我正确的话,它是一个右值引用。我不理解pcl::PointCloud类型如何成为右值引用。代码如下: pcl::PointCloud<pcl::PointXYZRGB> cloud; pcl::Poi

我试图创建一个tuple类型的tuple,pcl::visualization::PointCloudColorHandler>但当我将相应类型的参数传递到std::make_tuple时,它表示作为pcl::PointCloud传递的参数实际上是pcl::PointCloud&&,如果我正确的话,它是一个右值引用。我不理解pcl::PointCloud类型如何成为右值引用。代码如下:

pcl::PointCloud<pcl::PointXYZRGB> cloud;
pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr constCloud(&cloud);
pcl::io::loadPCDFile<pcl::PointXYZRGB>(file.getPCDFilePath().string(), cloud);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgbHandler(constCloud);
associatedClouds.insert(std::make_tuple<std::string, pcl::PointCloud<pcl::PointXYZRGB>, pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> >(file.getPCDFileName(), cloud, rgbHandler));
visualizedFiles.push_back(cloud);
pcl::点云;
pcl::PointCloud::ConstPtr constCloud(&cloud);
pcl::io::loadPCDFile(file.getPCDFilePath().string(),cloud);
pcl::visualization::PointCloudColorHandlerRGBField rgbHandler(constCloud);
insert(std::make_tuple(file.getPCDFileName(),cloud,rgbHandler));
可视化文件。推回(云);
我得到的错误是:

/Users/wfehrnstrom/CmakeTest/map.cpp:53:29: error: no matching function for call to 'make_tuple'
    associatedClouds.insert(std::make_tuple<std::string, pcl::PointCloud<pcl::PointXYZRGB>, pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> >(file.getPCDFileName(), cloud, rgbHandler));
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple:868:1: note: candidate function [with _Tp = <std::__1::basic_string<char>, pcl::PointCloud<pcl::PointXYZRGB>, pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>>] not viable: no known conversion from 'pcl::PointCloud<pcl::PointXYZRGB>' to 'pcl::PointCloud<pcl::PointXYZRGB> &&' for 2nd argument
make_tuple(_Tp&&... __t)
/Users/wfehrnstrom/CmakeTest/map.cpp:53:29:错误:调用“make\u tuple”时没有匹配函数
insert(std::make_tuple(file.getPCDFileName(),cloud,rgbHandler));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/./include/c++/v1/tuple:868:1:注意:候选函数[with _-Tp=]不可行:第二个参数没有从“pcl::PointCloud”到“pcl::PointCloud&&”的已知转换
生成元组(&&…)

我迷路了。谢谢。

切勿使用带有显式模板参数的
生成元组

我记得Microsoft STL maintainer引用了这句话,原因是
make\u tuple
足够聪明,可以去掉额外的引用,并且通过显式地声明模板参数,您无法达到它的目的

另一件事是
file.getPCDFileName()
是一个
Rvalue引用

从函数返回的临时值为右值。您可以使用局部变量
auto filename=file.getPCDFileName()
,然后使用
make\u tuple(file\u name,

切勿使用带有显式模板参数的
make\u tuple

我记得Microsoft STL maintainer引用了这句话,原因是
make\u tuple
足够聪明,可以去掉额外的引用,并且通过显式地声明模板参数,您无法达到它的目的

另一件事是
file.getPCDFileName()
是一个
Rvalue引用

从函数返回的临时值是右值。您可以使用局部变量
auto filename=file.getPCDFileName()
,然后
make\u tuple(file\u name,

make\u tuple
中删除
,只需
std::make\u tuple(file.getPCDFileName(),cloud,rgbHandler)
让模板参数推导完成它的工作。请格式化你的问题。它看起来像是狗吃掉了一半。嵌入的代码片段在背景符号之间传递:
`foo`
。从
make_tuple
中删除
,只需
std::make_tuple(file.getPCDFileName(),cloud,rgbHandler)
让模板参数推断完成它的工作。请格式化您的问题。它看起来像是狗吃掉了一半。嵌入的代码片段在背景符号之间,例如:
`foo`