我们可以创建临时传入`std :: vector <int>`参数吗?</int>

时间:2012-04-19 14:41:08

标签: c++

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;我们是否可以将临时向量传递给函数?

5 个答案:

答案 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, ....});

我正在初始化类似数组的向量,但没有给它起一个名字。对于单个或多个元素来说非常简单。