void PrintNow(const std::vector<int> &v)
{
std::cout << v[0] << std::endl;
}
std::vector<int>().push_back(20); // this line generates no complains
PrintNow(std::vector<int>().push_back(20)); // error
来自VS2010 Sp1:
错误C2664:'PrintNow':无法将参数1从'void'转换为 'const std :: vector&lt; _Ty&gt; &安培;'
Q&GT;我们是否可以将临时向量传递给函数?
答案 0 :(得分:14)
在C ++ 11中,您可以这样做:
void PrintNow(const std::vector<int> &v)
{
std::cout << v[0] << std::endl;
}
PrintNow({20});
VS2010尚不支持C ++ 11的这一部分。 (gcc 4.4和clang 3.1 do)
如果你只需要一个元素,那么在C ++ 03中你可以这样做:
PrintNow(std::vector<int>(1,20));
如果您需要多个元素,那么我认为没有任何一个行解决方案。你可以这样做:
{ // introduce scope to limit array lifetime
int arr[] = {20,1,2,3};
PrintNow(std::vector<int>(arr,arr+sizeof(arr)/sizeof(*arr));
}
或者你可以编写一个varargs函数,它接受一个int列表并返回一个向量。除非你经常使用它,但我不知道这是值得的。
答案 1 :(得分:5)
生成错误是因为std::vector::push_back
函数的返回类型为void
:
void push_back ( const T& x );
尝试以下方法:
PrintNow(std::vector<int>(1, 20));
上面的代码使用了std::vector
class:
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
答案 2 :(得分:4)
问题是std::vector::push_back()
返回void
,而不是你不能将临时函数传递给函数。
答案 3 :(得分:3)
如果所有元素具有相同的值,则您有一个符合您需求的构造函数:
PrintNow(std::vector<int>(1,20));
答案 4 :(得分:3)
是的。
points.push_back(vector<int>{1, 2, 3, ....});
我正在初始化类似数组的向量,但没有给它起一个名字。对于单个或多个元素来说非常简单。