C ++ 0x初始化列表通过引用传递

时间:2011-06-10 10:16:43

标签: c++ c++11

我试图以这种方式使用C ++ 0x初始化列表作为构造函数调用的参数:

Foo<float> foo("Foo 1", std::vector<const char *>({ "foo A", "foo B" }) );

使用构造函数

Foo(const char *name, std::vector<const char *> &foos)

使用这个构造函数,编译器抱怨:

error: no matching function for call to Foo<float>::Foo(
    const char [5], std::vector<const char *, std::allocator<const char *> >)
note: candidates are: Foo<T>::Foo(const char *, std::vector<const char *,
    std::allocator<const char *> >&) [with T = float]

然而,当我将构造函数更改为

Foo(const char *name, std::vector<const char *> foos)

一切都按预期工作。为什么第一个构造函数不起作用?我认为矢量可以在构造函数调用的位置构造并通过引用传递下来,但显然存在一些问题。有人可以解释一下吗?

由于

顺便说一下。我使用的是g ++版本4.4.5

修改 感谢下面的正确答案,我也找到了why I can't do that

6 个答案:

答案 0 :(得分:7)

您无法将临时绑定到T&

可以将临时绑定到T const&

Foo(const char* name, std::vector<const char*> const& foos)

但我会质疑vector char指针的完整性。 std::string出了什么问题?

答案 1 :(得分:3)

临时不能绑定到非const引用,所以这样做:

Foo(const char *name, const std::vector<const char *> &foos)
                    //^^^^ note this

答案 2 :(得分:2)

我认为初始化列表是一个红色的鲱鱼。您正在尝试将临时绑定到非const引用,这是非法的。尝试使用const引用。

Foo(const char *name, std::vector<const char *> const& foos)

答案 3 :(得分:1)

std::vector<const char *> &foos是左值参考。你试图传递rvalue,这是错误的。您可以使用右值引用std::vector<const char *> &&foos或const引用const std::vector<const char *> &foos

答案 4 :(得分:0)

您无法将右值std::vector绑定到非常量左值引用。您必须采用const左值参考或右值参考。

答案 5 :(得分:0)

您已经有了答案,但由于标题中有“初始化列表”,您可能需要考虑编写一个(C ++ 0x)初始化列表构造函数,例如:像这样:

struct Foo {
    Foo(const char* name, std::initalizer_list<const char*> il)
      : name(name), buf(il)
    { }
private:
    const char * const name;
    std::vector<const char *> buf;
};

然后你不再是聚合,但你可以像这样构建它:

Foo x("Name", { "ab", "cd", "ef" });

如果您愿意,甚至可以将il作为const-reference传递。