我有这个功能...

std::vector<int> GetAVector();


用作此函数的参数:

void ExpectingAVector(std::vector<int> &vec);


所以这个构造:

ExpectingAVector(GetAVector());


可以在Visual Studio 2012上编译,但不能在G ++,Eclipse Indigo,Ubuntu 12.04上编译

错误信息:
注意:参数1从'std :: vector'到'std :: vector&'的转换未知

因此,如果g ++无法支持此功能,我有什么选择?所有可能的替代品都不太优雅

a)声明一个向量,并通过引用GetAVector和ExpectingAVector传递它?
b)让GetAVector返回指向vector的指针,并让ExpectingAVector接受它吗?凌乱的清理
c)让ExpectingAVector接受矢量对象并接受效率低下吗?

做这个的最好方式是什么?

最佳答案

ExpectingAVector( GetAVector() );
                  |
                  +-------------Creates a temporary vector<int> object (rvalue)


采用 :

void ExpectingAVector(const std::vector<int> &vec);


临时对象无法绑定到非常量引用

这是Visual C ++的扩展,允许这种行为,可以通过某些标志禁用(我不知道是哪个标志)

您还可以在void ExpectingAVector(std::vector<int> &&vec ) { }中使用移动语义
如果您对C ++ 11没问题。

08-28 04:07