首页 文章

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

提问于
浏览 581
7
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 回答

  • 12

    在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列表并返回一个向量 . 除非你经常使用这个,但我不知道它是值得的 .

  • 5

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

  • 4

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

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

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

相关问题