我试图以这种方式使用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。
答案 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传递。