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

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:

eror C2664:'PrintNow':无法将参数1从'void'转换为'const std :: vector <_Ty>&'

问:我们可以将临时向量传递给函数吗?

回答(4)

3 years ago

在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));
}

或者你可以写一个varargs函数,它接受一个int列表并返回一个向量 . 除非你经常使用这个,但我不知道它是值得的 .

3 years ago

生成错误是因为 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() );

3 years ago

问题是 std::vector::push_back() 返回 void ,而不是你不能将临时函数传递给函数 .

3 years ago

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

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