14
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<_Ty> &”

Q> 是否可以将临时向量传递给函数?

4

5 回答 5

19

在 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 可以)

如果您只需要一个元素,那么在 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));
}

或者你可以编写一个可变参数函数,它接受一个整数列表并返回一个向量。除非你经常使用它,但我不知道它是否值得。

于 2012-04-19T14:48:01.087 回答
6

问题在于std::vector::push_back()返回void,而不是您不能将临时值传递给函数。

于 2012-04-19T14:42:50.973 回答
5

产生错误是因为std::vector::push_back函数的返回类型是void

void push_back ( const T& x );

尝试以下操作:

PrintNow(std::vector<int>(1, 20));

上面的代码使用了类的可用构造函数之一std::vector

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
于 2012-04-19T14:46:13.407 回答
5

Yes we can.

points.push_back(vector<int>{1, 2, 3, ....});

I'm initialising the vector like array and not giving it a name. Pretty simple for single or multiple elements.

于 2020-03-12T09:05:28.423 回答
4

如果所有元素都具有相同的值,则您有一个适合您需要的构造函数:

PrintNow(std::vector<int>(1,20));
于 2012-04-19T14:45:16.727 回答